题目链接:https://ac.nowcoder.com/acm/contest/322/E
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
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,位数是两位数。
解题思路
类似于伯爵说序列,类似题:https://blog.csdn.net/lzyws739307453/article/details/83582870,都是一些关于字符串处理的题。
#include <stdio.h>
#include <string.h>
char str[10010], tmp[10010];
void edge()
{
int cnt = 1, idx = 0;
int len = strlen(str);
for (int i = 1; i < len; i++)
{
if (str[i] != str[i - 1])
{
tmp[idx++] = cnt + '0';
tmp[idx++] = str[i - 1];
cnt = 1;
}
else cnt++;
}
tmp[idx++] = cnt + '0';
tmp[idx++] = str[len - 1];
tmp[idx] = '\0';
}
int main()
{
int n;
while (~scanf("%s%d", str, &n))
{
for (int i = 1; i < n; i++)
{
edge();
strcpy(str, tmp);
}
printf("%d %s\n", strlen(str), str);
}
return 0;
}