题目链接:点击打开链接
循环数是那些不包括0且没有重复数字的整数(比如81362)并且还应同时具有一个有趣的性质, 就像这个例子: 8 1 3 6 2
如果你从最左边的数字开始(在这个例子中是8)向右数最左边这个数(如果数到了最右边就回到最左边),你会停止在另一个新的数字(如果没有停在一个不同的数字上,这个数就不是循环数).就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以我们得到的下一个数字是6。
重复这样做 (这次往后6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是我们得到了2
再这样做 (这次往后数2个): 8 1,我们得到了1.
再一次 (这次往后数1个): 3
又一次: 6 2 8 这时你回到了起点,在经过每个数字一次后回到起点的就是循环数。如果你经过每一个数字一次以后没有回到起点, 你的数字不是一个循环数。
给你一个数字 M, 找出第一个比 M大的循环数, 输出数据保证结果能用一个无符号长整型数装下。
输入包括一行,为整数M(0≤M≤100000000)
输出包括一行,为第一个比M大的循环数。
样例输入
81361
样例输出
81362
一定要认真读题。。。。。。。
#include<stdio.h> #include<string.h> using namespace std; int main() { long long m; int a[30],visit[15],b[30]; int j,ans,l; long long i,n; scanf("%lld",&m); for(i=m+1;;i++) { n=i; l=0; ans=0; memset(visit,0,sizeof(visit)); while(n) { if(n%10==0||visit[n%10]==1) { ans=1; break; } visit[n%10]=1; a[l++]=n%10; n/=10; } if(ans==1) continue; for(j=0;j<l;j++) b[j]=a[l-1-j]; int p=(b[0]+0)%l; j=0; while(b[p]!=0) { int u=b[p]; b[p]=0; p=(u+p)%l; j++; } if(j==l) { printf("%lld\n",i); break; } } return 0; }