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
初步分为两种情况,有限小数、纯循环小数和非纯循环小数。循环小数的计算方法相同
1. 有限小数
这个就直接有几位分母就写1后面加几个零。
2. 循环小数
先将这个小数乘10的次方乘到小数点后面是纯循环,前面是不循环部分和一个循环部分的组合。
再写一个将右边乘为纯循环小数,左边只有不循环部分。
两式相减。
代码中,循环部分数量为n,数字为a,不循环部分数量为m,数字为b
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
char ch[20];
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>ch;
int n=0,m=0,a=0,b=0,f=0;
int l=strlen(ch);
for(int i=2;i<l;i++)
{
if(ch[i]=='(')
{
f=1;
}
else if(ch[i]>='0'&&ch[i]<='9')
{
if(f)
{
n++;
a=a*10+ch[i]-'0';
}
else
{
m++;
b=b*10+ch[i]-'0';
}
}
}
int t1,t2;
if(n==0)
{
t1=b;
t2=pow(10,l-2);
}
else
{
t1=b*pow(10,n)+a-b;
t2=pow(10,n+m)-pow(10,m);
}
int tmp=gcd(t2,t1);
cout<<t1/tmp<<'/'<<t2/tmp<<endl;
}
}