题目
源地址:
http://poj.org/problem?id=1047
理解
一开始觉得很麻烦,打算用字符串+排序来处理是否符合题意。但是无意中发现,事实上当一个数是循环数的时候,这个数本身乘以它的长度+1恰好使得每一位上的数都是9,比如142857*(6+1)=999999
。发现了这一点,题目就变成一道水题了。用java的高精度类水掉即可~
新技能get
循环数的性质
- 乘以产生一个循环数的质数时,结果会是一系列的9.如 142857 × 7 = 999999。
- 如果将其按位划分成若干等长份并加在一起,结果会是一系列的9.这是Midy定理的特殊情况。如14 + 28 + 57 = 99 142 + 857 = 999 1428 + 5714+ 2857 = 9999
- 所有的循环数都是9的倍数。
代码
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
BigInteger b, c, d;
String str, str1, str2, str3;
int i, len;
while (cin.hasNext()) {
str = cin.next();
b = new BigInteger(str);
len = str.length() + 1;
char []kids = new char[len - 1];
for (i = 0; i < len - 1; i++)
kids[i] = '9';
str3 = new String(kids);
str1 = String.valueOf(len);
c = new BigInteger(str1);
d = b.multiply(c);
str2 = d.toString();
if (str2.compareTo(str3) == 0)
System.out.println(str + " " + "is cyclic");
else
System.out.println(str + " " + "is not cyclic");
}
}
}
更新日志
- 2014年07月18日 已AC。