一:问题描述
Description: As we know, a rational number is a number that can be represented as y/x where x and y are integers and y is not equal to zero. On the hand, a rational number could also be represented in decimal form and the resulting decimal is a finite decimal or an infinite repeating decimal. Now, you are given the x and y , please return the decimal form of y/x in string format, and enclose the repeating part for the infinite repeating decimal in parentheses, for example:
X=1, Y=2, return ‘0.5’
X=2, Y=3, return ‘0.(6)’
X=7, Y=15, return ‘0.4(6)’
二:斟酌题意:
其实就是将 一个 分数用 小数表示,如果是无限循环小数,那么用括号将循环节 括起来。事例已经说明这点。
三:思路以及方法
不妨先假设分子为26,分母为23。根据此实例加以分析。
我们先计算整数部分 pre = 26/23 ,小数部分 为 分子 numerator = 26 % 23 =3,分母denominator为 23。我们循环计算余数 remainder[i] = numerator *10 % denominator ,如果发现 存在2个相同的余数numerator,那么就开始出现 循环节。意味着循环节从此开始,到再次出现为止。
当然,我们要先计算 从小数点到 开始出现循环节的位置的部分。思路很简单,只要余数不是numerator,就一直计算一位同时重新计算余数,直至出现余数为numerator.
四:C代码如下
/*
1.运行环境:windows 7 + 32位系统 + vs2013
2.无差错控制,无安全检查,无特殊处理。
3.带刺的银杏 2015.05.17夜 于 苏州
*/
#include <stdio.h>
#define MAX_denomintor 3000 // 分母最大值
int main(void)
{
int numerator, denominator, loop_start,point_to_loop_numerator; //分别为 分子,分母,循环节开始时的余数,小数点到出现循环节的计算
int remainder[MAX_denomintor],flag_loop; //remainder为余数数组,flag_loop=0/1 ,0为有限循环,1为无线循环小数。
printf("please input numerator and denominator:");
scanf("%d%d", &numerator, &denominator);
if(denominator > MAX_denomintor - 1 ) //如果分母过大,则终止程序
{
printf("the denomintor is too big !!");
return -1;
}
printf("%d.",numerator/denominator); //先输出整数部分
numerator %= denominator;
point_to_loop_numerator = numerator;
remainder[0] = 1; //remainder[numerator]=1代表出现numerator这个余数
remainder[numerator] = 1;
numerator = numerator*10%denominator;
for(;remainder[numerator] != 1;remainder[numerator] = 1,numerator = numerator*10%denominator); //循环求 余数
flag_loop = (numerator == 0) ? 0 : 1; //判断是否为循环小数
while (point_to_loop_numerator != numerator) //计算小数点到开始循环之间的小数部分
{
printf("%d",point_to_loop_numerator*10/denominator);
point_to_loop_numerator = point_to_loop_numerator*10%denominator;
}
if(flag_loop == 0)
{
return;
}
printf("("); //准备打印循环节
loop_start = numerator;
do
{
printf("%d", numerator*10/denominator);
numerator = numerator*10%denominator;
} while (numerator != loop_start);
printf(")\n");
return 0;
}
五.小结
整体较容易,思路在手,一切都有。