题目(斯伦贝谢 slb 09 校园招聘试题):
给定两个整数M和N,满足0 < M < N < 100。现在要求求出来M/N的精确值,也就是说,如果能够整除,那么需要得到结果;如果不能整除,那么要求是得到小数点后面到第一个循环节结束的地方, 并且指出循环节从小数点后第几位开始,小数点后第几位结束。
答案:
初始化:
index = 1;
A[i] = 0; //(i=0,…99)
B[i] = 0; //(i=0,…99)
int begin = 0;
int end = 0;
然后:
while(M != 0) {
if(B[M] != 0) {
begin = B[M];
end = index;
break;
}
B[M] = index;
A[index] = M*10/N;
M = M*10 % N;
index++;
}
然后输出结果就OK了。
举个例子:4/7
编号 余数 当前位
0. 4 0.(初始,个位数是0,后面开始小数点之后的)
1. 5 5(40/7 = 5; 40%7 = 5,此时B[4]=1, A[1]=5)
2. 1 7(B[1]=2, A[2]=7)
3. 3 1(B[3]=3, A[3]=1)
4. 2 4(B[2]=4, A[4]=4)
5. 6 2(B[6]=5, A[5]=2)
6. 4 8(到这儿循环结束,因为4在编号为0的那一行出现了,当前B[4]=1而不是0,这时候begin=1, end=6,循环节的长度是6)