Problem Description
Ray 在數(shù)學(xué)課上聽老師說,任何小數(shù)都能表示成分?jǐn)?shù)的形式,他開始了化了起來往枷,很快他就完成了,但他又想到一個問題凄杯,如何把一個循環(huán)小數(shù)化成分?jǐn)?shù)呢?
請你寫一個程序不但可以將普通小數(shù)化成最簡分?jǐn)?shù)错洁,也可以把循環(huán)小數(shù)化成最簡分?jǐn)?shù)。
Input
第一行是一個整數(shù)N戒突,表示有多少組數(shù)據(jù)屯碴。
每組數(shù)據(jù)只有一個純小數(shù),也就是整數(shù)部分為0膊存。小數(shù)的位數(shù)不超過9位导而,循環(huán)部分用()括起來。
Output
對每一個對應(yīng)的小數(shù)化成最簡分?jǐn)?shù)后輸出膝舅,占一行嗡载。
Sample Input
3 0.(4) 0.5 0.32(692307)
Sample Output
4/9 1/2 17/52
將一個小數(shù)或者循環(huán)小數(shù)轉(zhuǎn)化為分?jǐn)?shù),需要數(shù)學(xué)方面的知識仍稀。
參見百度百科:無限循環(huán)小數(shù)化分?jǐn)?shù)洼滚,http://baike.baidu.com/view/2625314.htm
其中的公式法比較適合寫程序:
純循環(huán)
用9做分母,有多少個循環(huán)數(shù)就幾個9技潘,比如0.3遥巴,3的循環(huán)就是9分之3,0.654享幽,654的循環(huán)就是999分之654铲掐, 0.9,9的循環(huán)就是9分之9(1)值桩,以此類推摆霉。
混循環(huán)
例:把混循環(huán)小數(shù)0.123˙68˙化成分?jǐn)?shù):
解: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做分母,首先有一個循環(huán)節(jié)有幾位數(shù)字就幾個9,接著有幾個沒加入循環(huán)的數(shù)就加幾個0携栋,再用第二個循環(huán)節(jié)以前的小數(shù)部分組成的數(shù)與小數(shù)部分中不循環(huán)部分組成的數(shù)的差做分子搭盾,比如0.43,3的循環(huán)婉支,有一位數(shù)沒加入循環(huán)鸯隅,就在9后面加一個0做分母,再用43減4做分子向挖,得 90分之39蝌以,0.145,5的循環(huán)就用9后面加2個0做分母何之,再用145減14做分子跟畅,得900分之131,0.549帝美,49的循環(huán)碍彭,就 用99后面加1個0做分母,用549減5做分子悼潭,最后得990分之545庇忌,以此類推,能約分的要化簡舰褪。
因此可以算出分子分母皆疹,最后約分即可,需要用到最大公約數(shù)的算法占拍。
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
* /