</pre><pre name="code" class="cpp">
循环数
循环数是那些不包括0这个数字的没有重复数字的整数 (比如说, 81362) 并且同时具有一个有趣的性质, 就像这个例子:
如果你从最左边的数字开始 (在这个例子中是8) 数最左边这个数字到右边(回到最左边如果数到了最右边),你会停止在另一个新的数字(如果没有停在一个不同的数字上,这个数就不是循环数). 就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以下一个数字是 6.
重复这样做 (这次从“6”开始数6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是2.
再这样做 (这次数2个): 8 1
再一次 (这次数1个): 3
又一次(这次数3个): 6 2 8 这时你回到了起点。
如果你从每一个数字开始数一次以后没有回到起点, 你的数字不是一个循环数。
给你一个数字 M (在 1到9位之间), 找出第一个比 M 大的循环数, 并且一定能用一个无符号长整型数装下。
文件输入
仅仅一行, 包括M
文件输出
仅仅一行,包括第一个比 M 大的循环数。
样例输入
81361
样例输出
81362
水题没啥好说的,无脑模拟然而注意要从m+1开始因为m本身也可能是循环数。。。我就因此坑掉1个点
</pre><pre name="code" class="cpp">
#include<cstdio>
#include<cstring>
#include<iostream>
short int a[10];
bool b[10];
int len;
bool qq() //判断有无重复的数字
{
int i,j;
for (i=0;i<=len-1;i++)
for (j=i+1;j<=len;j++)
if (a[i]==a[j]) return false;
return true;
}
bool xhs(long long n)
{
int i,j;
int c[10];
len=-1;
while (n!=0) //转在数组里存
{
len++;
c[len]=n%10;
if (c[len]==0) return false;
n/=10;
}
for (i=0;i<=len;i++) //方向跳过来
a[i]=c[len-i];
if (qq()==false) return false;
memset(b,0,sizeof(b)); //记录有无足迹 0为无 1为有
i=0; j=0;
do
{
j++;
b[(i+a[i])%(len+1)]=1; //核心算法
i=(i+a[i])%(len+1);
}while(j<len+1);
for (i=0;i<=len;i++) //是否全部经过
if (b[i]==0) return false;
return true;
}
int main()
{
long long old;
freopen("runround.in","r",stdin);
freopen("runround.out","w",stdout);
scanf("%lld",&old);old++;
while (xhs(old)==false) old++;
printf("%lld\n",old);
return 0;
}