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");
}