/*https://nanti.jisuanke.com/t/66循环数循环数是那些不包括0且没有重复数字的整数(比如81362)并且还应同时具有一个有趣的性质, 就像这个例子: 8 1 3 6 2如果你从最左边的数字开始(在这个例子中是8)向右数最左边这个数(如果数到了最右边就回到最左边),你会停止在另一个新的数字(如果没有停在一个不同的数字上,这个数就不是循环数).就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以我们得到的下一个数字是6。重复这样做 (这次往后6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是我们得到了2再这样做 (这次往后数2个): 8 1,我们得到了1.再一次 (这次往后数1个): 3又一次: 6 2 8 这时你回到了起点,在经过每个数字一次后回到起点的就是循环数。如果你经过每一个数字一次以后没有回到起点, 你的数字不是一个循环数。给你一个数字 M, 找出第一个比 M大的循环数, 输出数据保证结果能用一个无符号长整型数装下。输入包括一行,为整数M(0≤M≤100000000)输出包括一行,为第一个比M大的循环数。样例输入81361样例输出81362*//*【解题思路】解法:模拟操作、暴力枚举*/import java.util.*;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int num = in.nextInt(); while(true){ num++; int n = num; int length = 0; //读取num的位数 while(n != 0){ n /= 10; length++; } int a[] = new int[length]; n = num; //将num各个位的数提取出来存入数组a for(int i = length-1;i>=0;i--){ a[i] = n%10; n /= 10; } //检测数字num中各个位的数字是否互不相同 boolean isHasRepeatedNum = false; for(int i = 0;i<length;i++) for(int j = i+1;j<length;j++){ if(a[i] == a[j]){ isHasRepeatedNum = true; break; } if(isHasRepeatedNum) break; } if(isHasRepeatedNum) continue; //模拟题目中所要求的操作 int count = a[0];//往后数的次数 int currentIndex = 0;//往后数后当前的下标位置 int lengthBackup = length; while(true){ currentIndex = (currentIndex+count)%length;//采用模运算实现循环计数// System.out.PRintln("currentIndex="+currentIndex);// int t = in.nextInt(); //判断当前的数字是否不为0,如若是则将当前位置的数字变为0(标记操作) if(a[currentIndex] != 0){ count = a[currentIndex]; a[currentIndex] = 0; lengthBackup--;//标记操作一次后,长度减一,方便后面判断该数组a是否满足题意 } else break; } if(lengthBackup == 0){ System.out.println(num); break; } } }}
新闻热点
疑难解答