题目链接:http://train.usaco.org/usacoprob2?a=ScFaavqnaPI&S=runround
/*
ID: 1590291
TASK: runround
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
using namespace std;
/****************************************************************************************************************
题意:给定一个数字,输出大于该数字的最小循环数。循环数概念看题
思路:
1,枚举即可,把情况考虑全
2,注意题意 数字智能由 1~9组成且只出现一次,注意没有0!!!在遍历大于给定的数字时注意考虑
****************************************************************************************************************/
int sign[20],cont[20];
int fuc(long x)
{
memset(sign,0,sizeof(sign));
memset(cont,0,sizeof(cont));
int le=(int)log10(x)+1; //k为长度
int num=0;
if(le == 1) return 0;
for(int i = le-1;i >= 0;i -- , x/=10)
sign[i]=x%10;
for(int i = 0;i < le;i ++)
cont[sign[i]]++;
for(int i = 0;i < le;i ++)
if(cont[i] > 1)
return 0;
memset(cont,0,sizeof(cont));
int id=0;
for(int i = 0;i < le;i ++){
cont[sign[id]]++;
if(cont[sign[id]] > 1)
return 0;
id=(id+sign[id])%le;
}
if(id != 0) return 0; //这个最容易忘了,题意说不能有 0,这个就可以排除~
return 1;
}
int main()
{
ifstream fin("runround.in");
ofstream fout("runround.out");
unsigned long n;
while(fin>>n)
{
for(long i = n+1; ;i ++){
if(fuc(i)){
fout<<i<<endl;
break;
}
}
}
return 0;
}