题目
分子为1的分数称为单分数。分母是2到10的单分数用十进制表示如下:
1/2 = 0.5
1/3 = 0.(3)
1/4 = 0.25
1/5 = 0.2
1/6 = 0.1(6)
1/7 = 0.(142857)
1/8 = 0.125
1/9 = 0.(1)
1/10 = 0.1
其中0.1(6) 表示 0.166666…,因此它又一个长度为1的循环圈。可以看出1/7拥有一个6位的循环圈。找出小于1000的数字d,1/d 的十进制表示含有最长的循环圈。
解题方法
回忆小学所教的除法,在被除数小于除数时,需要乘10,直到不小于除数为止。如果一个被除数不能被除数整除,那么每次乘10后计算的余数都不为0,对于这样的数,如果余数列表出现循环,那么就可以计算出循环节长度。能表示分数形式的小数都有理数,所以循环节不会是无穷大。
例子:1/6
10÷6=1余数4索引1
4×10÷6=6余数4索引2
循环节长度就是2-1=1,因为后面都是上一行的式子的重复。
例子:1/7
1×10÷7=1余数3索引1
3×10÷7=4余数2索引2
2×10÷7=2余数6索引3
6×10÷7=8余数4索引4
4×10÷7=5余数5索引5
5×10÷7=7余数1索引6
1×10÷7=1余数3索引7
循环节长度为7-1=6,因为后面的式子都是索引1-6的式子的重复。
程序
public static void solve() {
int max = 0;
for (int i = 2; i < 1000; i++) {
int length = f(1, i);
if (length > max) {
max = length;
}
}
}
public static int f(int n, int m) {
n = n % m;
Vector<Integer> v = new Vector<>();
for (;;) {
System.out.print(n + ", ");
v.add(n);
n *= 10;
n = n % m;
// 有限小数
if (n == 0)
return 0;
// 余数重复,计算循环节长度
if (v.indexOf(n) >= 0)
return v.size() - v.indexOf(n);
}
}