非负数a,b(a<=b,b<>0),求a/b的小数部分:
设每次的余数为A,f = A*10^k(f为大等于b的最小整数)
求b+1次的f mod b的值,每次余数为A1,A2,A3,...,Ab,Ab+1,该序列的取值在0..b-1间,但序列项数有b+1个,
根据鸽巢原理得出必定存在相同的两项,即Ai = Aj (i < j)。
也就是会出现循环,循环的部分值应该为fi/b,f(i+1)/b,f(i+2)/b,...,f(j-1)/b,证毕.
X/Y:
设数列M:M[0] = X mod Y,M[n] = M[n-1] * 10 mod Y
则第i位小数的值必然为M[i-1]*10 / Y。
因为A mod Y必然在区间[0,Y)中,所以M[i]最多只有Y个数可供选择。所以当n >= Y时,从M[0]到M[n]的序列必然至少有两个数相等。
设M[i] = M[j], 0 <= i < j
则M[j+1] = M[j] *10 mod Y = M[i] * 10 mod Y = M[i+1];
从而可证从j开好始的无穷序列必然与从M[i]开始的无穷序列相同。而从M[i]到M[j]为一有限序列,所以这个无穷序列必然是M[i]..M[j]的无限重复。
从而小数位序列M[i-1]*10/Y也必然重复。