描述

计算分数的精确值。使用数组精确计算M / N(0 < M < N ≤ 100)的值。如果M / N是无限小数或小数部分超过20位,则精度要求小数点后20位,并输出。

说明

由于计算机内字长有限,常规的浮点数运算都有精度限制,为了得到高精度的计算结果,就必须自行设计算法,这里涉及到的算法是高精度算法中的除法。

提示

可以将商存放在一维数组中,进行除法运算,可模拟人的手工操作,即每次求出商的一位后,将余数乘以10,再计算商的下一位。若某次余数为0,则为有限不循环小数。若某次计算后的余数与前面某个余数相同时,则M / N是无限循环小数。

代码C

#include<stdio.h>

int main()
{
    int M, N;
    int place[25];

    while (~scanf("%d %d", &M, &N))
    {
        printf("0.");
        int key = 0;
        while (M % N && key < 20)
        {
            M *= 10;
            place[key] = M / N;
            M %= N;

            printf("%d", place[key++]);
        }
        printf("\n");
    }

    return 0;
}

另:如果想要判断其是否是循环小数以及循环节具体是什么,只需要加一个存放余数的数组,再加一个余数的对比(循环),查找是否存在相同的余数。