【基礎】循環數 【模擬】
1096: 【基礎】循環數【模擬】
時間限制: 1 Sec 內存限制: 128 MB
提交: 426 解決: 283
[提交][狀態][討論版]
題目描述
描述
n 位的一個整數是循環數(cyclic)的條件是:當用一個 1 到 n 之間的整數去乘它時, 會得到一個將原來的數首尾相接循環移動若幹數字再在某處斷開而得到的數字。也就是說,如果把原來的數字和新的數字都首尾相接,他們得到的環是相同的。只是兩個數的起始數字不一定相同。例如,數字 142857 是循環數,因為:
142857 *1 = 142857
142857 *2 = 285714
142857 *3 = 428571
142857 *4 = 571428
142857 *5 = 714285
142857 *6 = 857142
輸入
輸入
寫一個程序確定給定的數是否是循環數。輸入包括多個長度為 2 位到 60 位的整數。(註意,先導的0也是合理的輸入不應該被忽略,例如 "01"是 2 位數,"1" 是 1 位數。)
輸出
輸出
對於每一個輸入的整數,輸出一行表明它是否是循環數。
樣例輸入
142857
142856
142858
01
0588235294117647
樣例輸出
142857 is cyclic
142856 is not cyclic
142858 is not cyclic
01 is not cyclic
0588235294117647 is cyclic
思路:將一開始輸入的數轉變為字符串,獲取其位數n之後,在n次循環的乘積裏面,將每個乘積結果都轉變為字符串並與之相比較,若有不同,則將控制判斷的flag設為false並跳出循環,輸出"非循環數"的結果。否則輸出"循環數"的結果。
代碼:
package com.eangaie.main;
import java.util.*;
public class M1096 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String s,str, str1;
long
int n;// 位數
char[] arr, arr1;
String a=" is cyclic",b=" is not cyclic";
boolean flag;// 用來判斷是否為循環數
while (in.hasNext()) {
flag = true;
s = in.next();
str=s;
num = new Long(str);
n = str.length();// 獲取str的長度(位數)
arr = str.toCharArray();
Arrays.sort(arr);
str = fn(arr);// 獲得從小排到大的字符串
for (int i = 2; i <= n; i++) {
num *= i;
str1 = String.valueOf(num);// 把乘積再轉化為字符串
arr1 = str1.toCharArray();
Arrays.sort(arr1);
str1 = fn(arr1);
num /= i;
if (!str1.equals(str)) {// 若相乘後的數所有的位數沒有全部等於原來的所有位數,則不是循環數
flag = false;
break;
}
}
if (flag) {
System.out.println(s+a);
} else {
System.out.println(s+b);
}
}
}
static String fn(char[] arr) {
String s = "";
for (char c : arr) {
s += c + "";
}
return s;
}
}
【基礎】循環數 【模擬】