从M+1开始逐一判断是否是循环数,用数组来维护数的各个位数,可剪枝掉含0的数以及含重复数字的数。
/*
ID: xpli1
PROG: runround
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define OUT fout
#define IN fin
ofstream fout ("runround.out");
ifstream fin ("runround.in");
unsigned long M;
int d[10];
int n[10];
int num;
bool zero,repeat;
bool check(){
int ca = num;
int ad = 0;
int va = n[ad];
while(ca--){
ad = ad + va;
while(ad+1 > num){
ad -= num;
}
va = n[ad];
d[va]++;
}
for(int i=1; i<10; i++){
if(d[i] ==1) return false;
}
return true;
}
int main()
{
IN >> M;
unsigned long i;
for(i=M+1; ; i++){
memset(d,0,10*sizeof(int));
memset(n,0,10*sizeof(int));
zero = repeat = false;
num = 0;
unsigned long m = i;
while(m){
int j = m % 10;
if(j == 0) {zero = true;break;}
d[j]++;
if(d[j]>1) {repeat = true;break;}
n[num++] = j;
m /= 10;
}
if(zero || repeat) continue;
int pa = 0;
int pb = num-1;
while(pa < pb)
{
int t = n[pa];
n[pa] = n[pb];
n[pb] = t;
pa++;
pb--;
}
if(check()){
OUT << i << endl;
return 0;
}
}
return 0;
}