/*
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;
}
}
}
}
计蒜客题库_模拟、循环、暴力枚举_循环数
最新推荐文章于 2021-05-27 23:31:24 发布