【问题描述】
任何小数都能表示成分数的形式,对于給定的小数,编写程序其化为最简分数输出,小数包括简单小数和循环小数。
【输入形式】
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
【输出形式】
对每一个对应的小数化成最简分数后输出,占一行
【样例输入】
3 0.(4) 0.5 0.32(692307)
【样例输出】
4/9 1/2 17/52
【提示】
0.32(692307)=0.32 +0.(692307)/ 100 (*)
令 x=0.(692307), 那么 1000000x=692307+x
则 x=692307/999999,代入运算式(*)经过通分约分处理后即可得到结果。
#include <iostream>
using namespace std;
int main()
{
int T,j,a=0;
cin>>T;
for(j=0;j<T;j++)
{
int t1=1;
int k=0,K=1,K1=10,a=0,i=0;
string s;
cin>>s;
for(i=2;i<s.size();i++)
{
if(s[i]!='('&&s[i]!=')')
{
k=k*10+(s[i]-'0');//小数点后的数
K=K*10;
}
else if(s[i]=='(')
{
a=k;//括号前的数
K1=K;//0的个数
}
}
for(i=2;i<s.size();i++)
{
if(s[i]=='(')
{
for(int t=i+1;s[t]!=')';t++)
{
t1=t1*10;
}
t1-=1;
}
}
if(t1!=1)
{
K1=t1*K1;
}
else
{
;
}
k=k-a;
int K2=min(k,K1);
for(i=K2;i>0;i--)
{
if(k%i==0&&K1%i==0)
{
k=k/i;K1=K1/i;
break;
}
}
cout<<k<<"/"<<K1<<endl;
}
return 0;
}