/*https://nanti.jisuanke.com/t/66循環(huán)數(shù)循環(huán)數(shù)是那些不包括0且沒有重復(fù)數(shù)字的整數(shù)(比如81362)并且還應(yīng)同時具有一個有趣的性質(zhì), 就像這個例子: 8 1 3 6 2如果你從最左邊的數(shù)字開始(在這個例子中是8)向右數(shù)最左邊這個數(shù)(如果數(shù)到了最右邊就回到最左邊),你會停止在另一個新的數(shù)字(如果沒有停在一個不同的數(shù)字上,這個數(shù)就不是循環(huán)數(shù)).就像: 8 1 3 6 2 從最左邊接下去數(shù)8個數(shù)字: 1 3 6 2 8 1 3 6 所以我們得到的下一個數(shù)字是6。重復(fù)這樣做 (這次往后6個數(shù)字) 并且你會停止在一個新的數(shù)字上: 2 8 1 3 6 2, 也就是我們得到了2再這樣做 (這次往后數(shù)2個): 8 1,我們得到了1.再一次 (這次往后數(shù)1個): 3又一次: 6 2 8 這時你回到了起點,在經(jīng)過每個數(shù)字一次后回到起點的就是循環(huán)數(shù)。如果你經(jīng)過每一個數(shù)字一次以后沒有回到起點, 你的數(shù)字不是一個循環(huán)數(shù)。給你一個數(shù)字 M, 找出第一個比 M大的循環(huán)數(shù), 輸出數(shù)據(jù)保證結(jié)果能用一個無符號長整型數(shù)裝下。輸入包括一行,為整數(shù)M(0≤M≤100000000)輸出包括一行,為第一個比M大的循環(huán)數(shù)。樣例輸入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的位數(shù) while(n != 0){ n /= 10; length++; } int a[] = new int[length]; n = num; //將num各個位的數(shù)提取出來存入數(shù)組a for(int i = length-1;i>=0;i--){ a[i] = n%10; n /= 10; } //檢測數(shù)字num中各個位的數(shù)字是否互不相同 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];//往后數(shù)的次數(shù) int currentIndex = 0;//往后數(shù)后當(dāng)前的下標(biāo)位置 int lengthBackup = length; while(true){ currentIndex = (currentIndex+count)%length;//采用模運算實現(xiàn)循環(huán)計數(shù)// System.out.PRintln("currentIndex="+currentIndex);// int t = in.nextInt(); //判斷當(dāng)前的數(shù)字是否不為0,如若是則將當(dāng)前位置的數(shù)字變?yōu)?(標(biāo)記操作) if(a[currentIndex] != 0){ count = a[currentIndex]; a[currentIndex] = 0; lengthBackup--;//標(biāo)記操作一次后,長度減一,方便后面判斷該數(shù)組a是否滿足題意 } else break; } if(lengthBackup == 0){ System.out.println(num); break; } } }}
新聞熱點
疑難解答