
与班尼特·胡迪一起找简单规律
Time Limit: 1 s Memory Limit: 256 MB
Description
班尼特·胡迪发现了一个简单规律
给定一个数列,1 , 11, 21, 1211,1231 , 131221……,其规律如下:
1(首项),
前一项 “1” 中有1个1 -> 所以第二项为 11,
前一项 “11”中有2个1 ->所以第三项为 21,
前一项 “21”中有1个2,1个1 -> 所以第四项为1211,
1个2,3个1 -> 1231 ,
1个3,1个2,2个1 -> 131221,
……
现在,给你首项 n ,请输出数列中第m个数,0<m<1000000, m的总和不超过 1.1×10^6 ,n的长度不超过1000000.
Input
多组输入,每行输入两个自然数,n和m。
Output
每行输出一个答案。
Samples
input:
1 6
output:
131221
Author
Source
题解:统计一个数字出现的次数,然后次数+数字从大到小输出。
思路:这边要注意n的长度是0-1000000,注意不是大小!!!读入要用字符串读入。然后算m-1次。
贴一下我自己补的代码。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
int a[];
int num[];
int main()
{
char n[];
int m;
int l,i,numble;
while(scanf("%s %d",&n,&m)!=EOF) //读入数据
{
l=strlen(n); //字符串长度
for(i=;i<l;i++) //倒着读入
{
a[i]=n[i]-''; //存数字
}
m=m-;
while(m--) //循环m-1遍
{
memset(num,,sizeof(num)); //清空一次每个数字出现几次
for(i=;i<l;i++)
{
num[a[i]]++; //计算每个数字出现的次数
}
l=; //清空长度
for(i=;i<=;i++)
{
if(num[i]>) //从0开始,如果该数据出现了
{
a[l++]=i; //第一个输入是什么数字
while(num[i]>)
{
a[l++]=num[i]%; //第二个计算出现的次数,大于10要逐个取出来
num[i]/=;
}
}
}
}
for(i=l-;i>=;i--)
{
printf("%d",a[i]); //要从大到小输出
}
printf("\n");
}
system("pause");
return ;
}
贴一下出题人美丽的代码:https://paste.ubuntu.com/26264736/