题目链接: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; }