PPY的字符串

PPY的字符串

链接:https://ac.nowcoder.com/acm/contest/322/E
来源:牛客网

题目描述

Siry特别喜欢数学, 在他很小的时候他就对数字特别感兴趣, 他喜欢念数字。

具体念法是这样的: 给你一个数字, 依次念出每个数字有几个相邻(Siry会大声说出a个b, c个d...), 组合起来形成一个新的数字。

如:

2331的念法就是1个2,2个3,1个1, 形成的新数字就是122311。 再念一次就是1个1,2个2,1个3, 2个1, 形成的数字是11221321。

现在Siry大声的念出了第一次的数字x, Siry总共想要念n次, 你能快速的知道第n次的数字是多少吗?

输入描述:

 

每行输入两个数字x,n。 

1≤ x≤ 109,1≤ n≤ 30

 

输出描述:

输出一行,包括第n个数字的位数和这个数字。 位数和数字之间用空格隔开。

输入

222 2

输出

2 32

说明

第一次念出的数字是222, 第二次就会念3个2, 形成的数字就是32, 位数是两位数。

 

解题思路:本题虽然是一串数字,给的是一个不超过1e9的数,但是我们可以发现当这个数比如是
12345678时,读取30次之后将是一个十分庞大的数字,所以这里采用字符型数组存储结果,刚好
每位代表一个数字 

代码如下

#include<stdio.h>

#include<math.h>

#include<string.h>

#include<algorithm>

using namespace std;

int num[1000005] = {0};

int num1[1000005] = {0};

int main()
{
	
	char a[30] = {0}; 
	int n;
	
	scanf("%s %d", a, &n);
	
	int len = strlen(a);
	for(int i = 0; i < len; i++)
	
	num[i] = a[i] - '0';
	
	int k = 0;
	
	int cnt = 1;
	
	num[len] = 10;
	
	while(n - 1)
	{
		
		for(int j = 0; j < len; j++)
		{
			
			if(num[j] == num[j + 1])  //当本位数字与下一位相等是,次数加1 
			
			cnt++;
			
			else                    //不等时将次数和本位数字都存入数组 
			{
				num1[k] = cnt;
				
				cnt = 1;            //次数从1开始计算,答案数组每次后移两位 
				num1[k + 1] = num[j];
				k = k + 2;
			}
		}
		for(int j = 0; j < k; j++)
		{
			num[j] = num1[j];	
		}
		len = k;
		
		num[len] = 10;
		
		n--;
		
		k = 0;
	}
	
	printf("%d ",len);
	
	for(int i = 0; i < len; i++)
	
	printf("%d", num[i]);
	
	printf("\n");
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值