题目链接:点击打开链接
循环数是那些不包括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;
}