#include
int main() { double number; double fm=0.1; scanf("%lf",&number); double substitute = number; double fz =number*0.1;
//消除小数点,得到未化简的分子与分母
***第一次补充***/*重点:9/100 = 90/1000,故若不是直接进行fm,fz的计算,而是先算小数 位数,然后跳出循环,再去计算fm,fz。此时,小数点位数是否正确无影响。 只要保证包含所输入小数的有效数据,如0.36,那么小数位数至少为两位,0.009,小数位数至少为三位。 原理:如输入0.36,若用pow语句,fm为1000,那么fz=0.36*1000=360,而36/100 == 360/1000,所以为了保证一定含有有效数据,可以将小数位数定义为一个极高值,如6*/
- 第二次补充*/根据以上原理,可见,并不需要去求小数位数,我们可以直接将分母=1000000,输入小数1000000即可。 (!!!注:该方法为笨方法,浪费算力) do { substitute = substitute - (int)substitute; substitute=10; fm=10; fz*=10; } while ((int)substitute!=0); //
//不断除以公约数,得到化简后的分子与分母
int result;
int control;
int min;
do
{
//判断大小
switch (fz>fm) {
case 1:
min = fm;
default:
min = fz;
}
//
//除以公约数
/*该处的的思路:假设整个循环结束后都没进入if语句(正确),则为错误,故只要有一次正确就得跳出for循环。
(正确与错误的判断标准:进入if语句后要再次进行do-while循环,故为正确。)
由P16的做题思路一可见,一开始要设结果result = 0;
*/
result = 0;
for (control =2;control<=min;control++) {
if ((int)fz % control == 0 && (int)fm % control == 0) {
fz/=control;
fm/=control;
result = 1;
break;
}
}
} while (result);
//输出结果
printf("%f的分式为%d/%d",number,(int)fz,(int)fm);
return 0;
}