Problem Description
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
Output
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input
3 0.(4) 0.5 0.32(692307)
Sample Output
4/9 1/2 17/52
将一个小数或者循环小数转化为分数,需要数学方面的知识。
参见百度百科:无限循环小数化分数,http://baike.baidu.com/view/2625314.htm
其中的公式法比较适合写程序:
纯循环
用9做分母,有多少个循环数就几个9,比如0.3,3的循环就是9分之3,0.654,654的循环就是999分之654, 0.9,9的循环就是9分之9(1),以此类推。
混循环
例:把混循环小数0.123˙68˙化成分数:
解:0.123˙68˙=(0.12368+0.00000˙68˙)
=(12368/100000)+(68/9900000)
=[(12368/99000)-(12368/990000)]+(68/9900000)
=(12368/99000)+[(68/9900000)-(12368/9900000)]
=(12368/99000)-(12300/9900000)
=(12368-123)/99000
公式
用9和0做分母,首先有一个循环节有几位数字就几个9,接着有几个没加入循环的数就加几个0,再用第二个循环节以前的小数部分组成的数与小数部分中不循环部分组成的数的差做分子,比如0.43,3的循环,有一位数没加入循环,就在9后面加一个0做分母,再用43减4做分子,得 90分之39,0.145,5的循环就用9后面加2个0做分母,再用145减14做分子,得900分之131,0.549,49的循环,就 用99后面加1个0做分母,用549减5做分子,最后得990分之545,以此类推,能约分的要化简。
因此可以算出分子分母,最后约分即可,需要用到最大公约数的算法。
C代码如下,已通过:
#include "stdio.h"
int maxgongyueshu(int a,int b)
{
int c;
if(a < b)
{
c=a;
a=b;
b=c;
}
c=a%b;
while(c != 0)
{
a=b;
b=c;
c=a % b;
}
return b;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
char a[20];
scanf("%s",a);
int i=2,temp1=0,temp2=0,p1=0,p2=0,ans1=0,ans2=0;
while(a[i] != '\0')
{
if(a[i] == '(')
{
p1=i;
}
else if(a[i] == ')')
{
p2=i;
}
else
{
if(p1==0)
{
temp1=temp1*10+a[i]-'0';
}
else
{
temp2=temp2*10+a[i]-'0';
}
}
i++;
}
// printf("%d %d %d %d\n",temp1,temp2,p1,p2);
if(temp1==0)
{
ans1=temp2;
ans2=1;
for(i=p1;i < p2-1;i++)
ans2=ans2*10;
ans2--;
for(i=2;i < p1;i++)
ans2*=10;
}
else if(temp2==0)
{
ans1=temp1;
ans2=1;
for(i=2;a[i]!='\0';i++)
ans2=ans2*10;
}
else
{
ans1=temp1;
for(i=p1;i < p2-1;i++)
ans1=ans1*10;
ans1=ans1+temp2-temp1;
ans2=1;
for(i=p1;i < p2-1;i++)
ans2=ans2*10;
ans2--;
for(i=2;i < p1;i++)
ans2*=10;
}
i=maxgongyueshu(ans1,ans2);
ans1=ans1/i;
ans2=ans2/i;
printf("%d/%d\n",ans1,ans2);
}
}
/ * for test
0.368(616)
0.0105(717)
0.(18)
0.(168)
0.(1787)
0.0(869)
0.00(716)
0.36767
0.66558698
0.0687
0.0065
46031/124875
8801/832500
2/11
56/333
1787/9999
869/9990
179/24975
36767/10000
33279349/50000000
687/10000
13/2000
* /