小数化分数2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3420 Accepted Submission(s): 1258
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
Source
2007省赛集训队练习赛(2)
Recommend
lcy 思路: 小数化分数,从别人那里学来的简便方法。 有限小数: 乘以10^n/10^n,再化简,很简单。 纯无限循环小数: 例如0.(4),括号表示循环部分,分子为循环部分,分母为循环部分的数都换成9,0.(4)=4/9, 0.(abcd)=abcd/9999。; 混合无限循环小数: 例如0.32(692307),分子为有限部分连接上循环部分得到的数减去有限部分,分母为循环部分的数都换成9再连接上有限部分 的都数换成0的数,0.32(692307)=(32692307-32)/99999900。
代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iomanip>
using namespace std;
int main()
{
int t;
string s;
scanf("%d",&t);
while(t--)
{
cin>>s;
int flag=0,a=0,b=0,A=0,B=0;
int k=s.size();
for(int i=2;i<k;i++)
{
if(s[i]=='('&&i==2)
{
flag=1;
}
else if(s[i]=='('&&i!=2)
{
flag=2;
}
if(flag==0)
{
a=a*10+s[i]-'0';
A++;
}
if(flag!=0&&s[i]>='0'&&s[i]<='9')
{
b=b*10+s[i]-'0';
B++;
}
}
if(flag==0)
{
int n=a,m=pow(10,A);
A=m;
while(A%a!=0)
{
int r=A%a;
A=a;
a=r;
}
printf("%d/%d\n",n/a,m/a);
}
else if(flag==1)
{
int n=b,m=pow(10,B)-1;
B=m;
while(B%b!=0)
{
int r=B%b;
B=b;
b=r;
}
printf("%d/%d\n",n/b,m/b);
}
else if(flag==2)
{
int n=a*pow(10,B)+b-a,m=(pow(10,B)-1)*pow(10,A);
b=n;B=m;
while(B%b!=0)
{
int r=B%b;
B=b;
b=r;
}
printf("%d/%d\n",n/b,m/b);
}
}
return 0;
}