将有限小数化为分数的方法都知道,就是分子分母同时除以他们的最大公约数,不提。
无限循环小数化为分数的方法就是将这个数分别乘以10的倍数2次,使乘以的2个数的小数相同,然后相减约去小数,再算得。如:将x=23.37(593)化为分数。
100*x=2337.593593······,100000*x=2337593.593593······。则100000x-100x=2337593-2337,再将x化成分数即可。
具体如图:
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 500
using namespace std;
int gcd(int a,int b)//辗转相除法求最大公约数
{
int tmp;
if(a<b)
{
tmp=a;a=b;b=tmp;
}
tmp=a%b;
if(tmp==0)
return b;
else
return gcd(b,tmp);
}
int pow(int a,int b)
{
int pows=1;
for(int i=1;i<=b;i++)
pows*=a;
return pows;
}
int main()
{
int t,n,i;
char s[20];
scanf("%d",&t);
while(t--)
{
int x=0,y=0,tmp,tmp2;
scanf("%s",s);
n=strlen(s);
if(s[n-1]!=')')//不循环小数
{
for(i=0;i<n;i++)
{
if(s[i]=='.')
{
tmp=n-1-i;
y=pow(10,tmp);
}
else
{
x*=10;
x+=s[i]-'0';
}
}
tmp=gcd(x,y);
printf("%d/%d\n",x/tmp,y/tmp);
}
else//循环小数
{
for(i=0;i<n-1;i++)
{
if(s[i]=='.')
{
tmp=i;
}
else if(s[i]!='.'&&s[i]!='(')
{
x*=10;
x+=s[i]-'0';
}
else if(s[i]=='(')
{
tmp2=i;
y=x;
}
}
x=x-y;
y=pow(10,n-3-tmp)-pow(10,tmp2-1-tmp);
tmp=gcd(x,y);
printf("%d/%d\n",x/tmp,y/tmp);
}
}
return 0;
}