与班尼特·胡迪一起找简单规律(HZOJ-2262)

时间:2023-03-08 20:00:44
与班尼特·胡迪一起找简单规律(HZOJ-2262)

与班尼特·胡迪一起找简单规律

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/