题目大意
本题循环数概念:你从最左边的数字开始向右数最左边这个数(如果数到了最右边就回到最左边),你会停止在另一个新的数字(如果停在一个相同的数字上,这个数就不是循环数)
给你一个数字 M (在1到9位之间), 找出第一个比 M大的循环数
题目解析
是一道很基础的题,模拟就可以了
先将数字拆分为数组
只需要每位数向右数当前的数个位置后的,不重复且不循环即可
代码
#include<bits/stdc++.h>
using namespace std;
int n,t,num,pos;
int a[15],b[15];
bool flag[15],pd;
int main()
{
cin>>n;
for(int i=n+1;i<=999999999;i++)//因为最多只有9位数字,循环到这即可
{
memset(flag,0,sizeof(flag));
num=pd=0;
t=i;
while(t>0)
{
a[++num]=t%10;
if(flag[t%10]||t%10==0)//判断该数是否有0或者重复的数字
{
pd=1;
break;
}
flag[t%10]=1;
t/=10;
}
for(int j=1;j<=num;j++)
b[j]=a[num-j+1];
if(pd) continue;
memset(flag,0,sizeof(flag));
pos=1;
for(int j=1;j<=num;j++)
if(flag[(pos+b[pos])%num])//判断该位数往后数之后是否之前到达过
{
pd=1;
break;
}
else
{
flag[(pos+b[pos])%num]=1;//位置标记为1
pos=(pos+b[pos])%num;//更新位置
if(pos==0) pos=num;
}
if(!pd)
{
cout<<i;
break;
}
}
}