The decimal expansion of the fraction_note

题目:The decimal expansion of the fraction
思路:

题目要求为输入被除数和除数,输出结果、循环节、循环节个数。起始思路为使用数组存放并比较各个小数位的数值,寻找循环节,但无法实现。应记录各位余数,余数相同时进入循环。

实现:

通过循环进行小数点后位数的推进,可能发生的情况有两种:余数已经出现(找到循环节,通过比较余数值找到第一次循环开始的地方,从而确定循环节,可终止推进)、余数首次出现(记录该余数并继续推进)。
建立数组1用于存放小数位数值,数组2用于存放余数,数组3用于对余数是否已经存在进行判断。
找到循环节后对结果分部输出,注意输出时多个循环中的变量与条件,注意初始化。

总结:

有两个思维转换:
1.将表现在小数位数值的循环转换为余数的循环
2.用索引的方式判断余数是否已经存在

代码:
/*
definition:
num=numerator 被除数
den=denominator 除数
len=length 循环节长度
dec=decimal 用于存放小数数值的数组
rem=reminder 用于存放余数数值的数组
*/
#include
void main()
{
    int num, den, len;
    int dec[3000], rem[3000];
    while (~scanf("%d %d", &num, &den))
    {
        int flag[3000] = { 0 };             //初始化索引
        printf("%d/%d=", num, den);
        for (int i = 0;; i++)
        {
            dec[i] = num / den;
            rem[i] = num % den;
            if (i > 0 && flag[rem[i]] == 1)                                     //余数已经出现
            {
                for (int j = 0;; j++)
                    if (rem[i] == rem[j])
                    {
                        len = i - j;

                        printf("%d.", dec[0]);
                        for (int k = 1; k <= j; k++)
                            printf("%d", dec[k]);
                        printf("(");
                        if (len <= 50)          //题目要求循环节最大输出个数为50
                            for (int k = j + 1; k <= i; k++)
                                printf("%d", dec[k]);
                        else  
                        {
                            for (int k = j + 1; k <= j + 1 + 49; k++)
                                printf("%d", dec[k]);
                            printf("...");
                        }
                        printf(")\n");
                        break;
                    }
                break;
            }
            else                                                                      //余数未出现
            {
                flag[rem[i]] = 1;
                num = rem[i] * 10;
            }
        }
        printf("%d=number of digitd in repeating cycle\n", len);
    }
}

你可能感兴趣的:(The decimal expansion of the fraction_note)