2.2.3 RUNAROUND NUMBERS 循环数
PS:最近工作比较忙,所以把以前在学校做acm的时候写的一些解题报告发出来
http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=2327
题目大意:(如题)
输入输出:(如题)
解题思路:从开始数后一个数往后枚举,然后判断其是不是循环数,如果是就输出退出。
- void transfer() //转换函数,将整数的每一位数提取出来
- {
- int i;
- n=0;
- while(tmp>0)
- {
- i=tmp%10;
- tmp/=10;
- tmpstr[n]=i;
- n++;
- }
- for(i=0;i<=n;i++)
- str[i]=tmpstr[n-i];
- }
- void check()
- {
- int i,j,k;
- for(i=0;i<10;i++)
- mrk[i]=0;
- for(i=1;i<=n;i++)
- mrk[str[i]]++;
- for(i=0;i<=9;i++)
- {
- if(mrk[i]>1) //数里面有位数的数字重复
- {
- flag=false;
- return;
- }
- }
- j=1;
- for(i=0;i<10;i++)
- mrk[i]=0;
- for(i=1;i<=n;i++) //每位数判断
- {
- k=str[j];
- j=(str[j]+j)%n; //循环
- if(!j)j+=n;
- if(mrk[j]!=0||str[j]==k) //不满足循环数的条件或者已经判断过了,往后走k步出现的数和k相同
- {
- flag=false;
- return;
- }
- mrk[j]=1; //标记判断过了
- }
- if(j==1)
- {
- flag=true;
- return;
- }
- }