Problem Description
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
Output
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input
3 0.(4) 0.5 0.32(692307)
Sample Output
4/9 1/2 17/52
Source
思路:思路嘛,用文字描述起来比较困难,直接看数据吧:
0.(4)*10-0.(4)=4.(4)-0.(4)=4
0.(4)*10-0.(4)=0.(4)*9
0.(4)=0.(4)*9/9=4/9
0.5→5/10→1/2
0.32(692307)*100000000-32.(692307)=32692307.(692307)-32.(692307)=3269275
0.32(692307)*100000000-32.(692307)=0.32(692307)*99999900
0.32(692307)=0.32(692307)*99999900/99999900=3269275/99999900→17/52
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int t;
char a[120];
scanf("%d",&t);
while(t--)
{
int flag=0,s,s1=0,s2=0,s3=0,sum,sum1=1,sum2=0;
scanf("%s",a);
for(int i=2; i<strlen(a); i++)
{
if(a[i]=='(')
{
flag=1;
continue ;
}
if(a[i]==')')
break;
if(flag==0)
{
s1=s1*10+a[i]-'0'; //不循环部分
sum1=sum1*10;
}
else
{
s2=s2*10+a[i]-'0'; //循环部分
sum2=sum2*10+9;
}
s3=s3*10+a[i]-'0'; //循环部分与不循环部分连起来
}
if(sum1==1) //如果只有不循环部分
{
s=s2;
sum=sum2;
}
else if(sum2==0) //如果只有循环部分
{
s=s1;
sum=sum1;
}
else //如果都有
{
s=s3-s1;
sum=sum1*sum2;
}
printf("%d/%d\n",s/__gcd(s,sum),sum/__gcd(s,sum));
}
return 0;
}