分数转循环小数
题目
B6.2 计算\(\frac{a}{b}\)的小数值,已知\(0<a<b<32767\)。若能除尽,则直接显示结果,例如\(\frac{3}{5}=0.6\);否则,则用循环节显示其精确结果,例如\(\frac{116}{165}=0.703(03)\),其中括号内标示出循环节。这里指的是数学中的除法,不是计算机中的整数除法,因此结果不是0。
本题目不需要使用数组或动态分配空间等技术。
这本是一道可以放在第4章的题目,放在这里,提示借鉴指针的思想
解
先想有数据结构的时候,那就把每次的被除数记下,发现两次相同,就会产生循环。
那么当连数组都没有的时候怎么办呢?
//输出a/b
int print(int a, int b)
{
if(a%b==0) printf("%d",a/b),return 0;
printf("%d.", a / b),a %= b;
while (a!=0)
{
a *= 10;
printf("%d", a / b);
a %= b;
}
return 0;
}
注意到每次while中a<b<maxn,如果x不是有限位小数则在maxn次循环一定会出现重复,它就是循环节中的一员,利用它可以找出循环节的长度。
int OneOfTheCircle = a;
for(int k=0;k<maxn;k++)
{
OneOfTheCircle *= 10;
OneOfTheCircle %= b;
}
int t = (OneOfTheCircle * 10) % b, len = 1;
while (t != OneOfTheCircle) {
t = (t * 10) % b;
len++;
}
如何找出不在循环节中的部分?那就从头开始,一位一位判断len次运算后是否和该位处于相同状况,发现了就大功告成。

浙公网安备 33010602011771号