题目大意:
循环数是不包括0且没有重复数字的整数并且还应同时具有一个有趣的性质,例如81362:
8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以下一个数字是6
重复这样做 (这次从“6”开始数6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是2
再这样做 (这次数两个): 8 1
再一次 (这次一个): 3
又一次: 6 2 8 这时你回到了起点,在经过每个数字一次后回到起点的就是循环数。如果你经过每一个数字一次以后没有回到起点, 你的数字不是一个循环数。
给你一个数字 M, 找出第一个比 M大的循环数。
要求循环数每个数位都必须要访问到
输出数据保证结果能用一个无符号长整型数(21亿)
M在1到9位之间
题解:
从m+1开始枚举,
每次枚举判断一下有没有0,有没有重复数字
然后模拟一下过程,
最后判断一下每个数位是否都访问到,然后当前是否位置为1
代码:
#include<bits/stdc++.h>
#define N 15
using namespace std;
int n;
bool check(int x)
{
int a[N]={0},b[N]={0},c[N]={0},cnt=0;
while (x>0){
if (x%10==0) return 0;
a[++cnt]=x%10;
x/=10;
}
for (int i=1; i<=cnt; i++)
{
if (b[a[i]]) return 0;
b[a[i]]=1;
}
for (int i=1; i<=cnt; i++) b[i]=a[cnt-i+1];
int cp=1;
for (int i=1; i<=cnt; i++)
{
if (cp+b[cp]<=cnt){
c[cp]=1;
cp+=b[cp];
}
else if (cp+b[cp]>cnt){
c[cp]=1;
cp+=b[cp];
if(cp%cnt) cp%=cnt;
else cp=cnt;
}
}
for(int i=1; i<=cnt; i++)
if(!c[i]) return 0;
if (cp==1) return 1;
return 0;
}
int main()
{
scanf("%d",&n);
while("rp++"){
n++;
if (check(n)){
printf("%d\n",n);
return 0;
}
}
}