Translation
循环数是这样的整数:它包含的数字都是独特不相同的,(如1111就是不正确的),而且没有0,例如81362。它有一个有趣的性质:
1.从左端开始,当前的数是多少就往右数几位(首尾相接,即认为最右边的数字之后是左边第一个数),对于81362,你将会停在一个新数字6上
2.重复上述过程,这回数6个数字因为刚刚停在6上。你将会停在2上
3.继续,(数2个数字),停在1
4.继续,(数1个数字),停在3
5.停在8,这个时候你已经接触了每个数字一次且仅一次。如果不是这样,那就不是循环数。
给定一个数M,找到并输出刚好比M大的下个循环数。使用unsigned long存储M
PROGRAM NAME: runround
INPUT FORMAT:(file runround.in)
仅仅一行, 包括M
OUTPUT FORMAT:(file runround.out)
仅仅一行,输出第一个比M大的循环数。
Solution
模拟就好。
Code
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int num[10],p[10]; int main(){ int i,j,k,m,n; freopen("runround.in","r",stdin); freopen("runround.out","w",stdout); scanf("%d",&m); for(i=m+1;;i++){ int t=0,s=i; while(s>=1){ num[++t]=s; s/=10; } int flag=0; for(j=1;j<t;j++) for(k=j+1;k<=t;k++) if(num[j]==num[k]) flag=1; if(flag)continue; memset(p,0,sizeof(p)); int sum=0,len=t; flag=0; while(sum<=len){ sum++; if(p[t]){ flag=1; break; } p[t]=1; t=t-num[t]; while(t<0)t+=len; while(t>len)t-=len; } if(!flag){ printf("%d\n",i); break; } } return 0; }
