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 num;
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;
}
}