分数转循环小数

题目

​ 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次运算后是否和该位处于相同状况,发现了就大功告成。

posted @ 2021-10-14 20:15  zigon  阅读(243)  评论(0)    收藏  举报