题目:The decimal expansion of the fraction
思路:
题目要求为输入被除数和除数,输出结果、循环节、循环节个数。起始思路为使用数组存放并比较各个小数位的数值,寻找循环节,但无法实现。应记录各位余数,余数相同时进入循环。
实现:
通过循环进行小数点后位数的推进,可能发生的情况有两种:余数已经出现(找到循环节,通过比较余数值找到第一次循环开始的地方,从而确定循环节,可终止推进)、余数首次出现(记录该余数并继续推进)。
建立数组1用于存放小数位数值,数组2用于存放余数,数组3用于对余数是否已经存在进行判断。
找到循环节后对结果分部输出,注意输出时多个循环中的变量与条件,注意初始化。
总结:
有两个思维转换:
1.将表现在小数位数值的循环转换为余数的循环
2.用索引的方式判断余数是否已经存在
代码:
/*
definition:
num=numerator 被除数
den=denominator 除数
len=length 循环节长度
dec=decimal 用于存放小数数值的数组
rem=reminder 用于存放余数数值的数组
*/
#include<stdio.h>
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);
}
}
网友评论