与班尼特·胡迪一起找简单规律
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次。
贴一下我自己补的代码。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream> 6 using namespace std; 7 int a[1000000]; 8 int num[10]; 9 int main() 10 { 11 char n[1000000]; 12 int m; 13 int l,i,numble; 14 while(scanf("%s %d",&n,&m)!=EOF) //读入数据 15 { 16 l=strlen(n); //字符串长度 17 for(i=0;i<l;i++) //倒着读入 18 { 19 a[i]=n[i]-'0'; //存数字 20 } 21 m=m-1; 22 while(m--) //循环m-1遍 23 { 24 memset(num,0,sizeof(num)); //清空一次每个数字出现几次 25 for(i=0;i<l;i++) 26 { 27 num[a[i]]++; //计算每个数字出现的次数 28 } 29 l=0; //清空长度 30 for(i=0;i<=9;i++) 31 { 32 if(num[i]>0) //从0开始,如果该数据出现了 33 { 34 a[l++]=i; //第一个输入是什么数字 35 while(num[i]>0) 36 { 37 a[l++]=num[i]%10; //第二个计算出现的次数,大于10要逐个取出来 38 num[i]/=10; 39 } 40 } 41 } 42 } 43 for(i=l-1;i>=0;i--) 44 { 45 printf("%d",a[i]); //要从大到小输出 46 } 47 printf("\n"); 48 } 49 system("pause"); 50 return 0; 51 }
贴一下出题人美丽的代码:https://paste.ubuntu.com/26264736/