#include <stdio.h>
#include <string.h>
#include <math.h>
//************************************* //题目: // 精确表达浮点数 // //思路: // 1.对于有限小数 // 如:X=0.a1a2……an=(a1a2……an)/10^n=(a1a2……an/(gcd(a1a2……an,10^n)))/(10^n/gcd(a1a2……an,10^n)); // 2.对于无限小数 // 如:X=0.a1a2……an(b1b2……bm)=(a1a2……an+0.(b1b2……bm))/10^n // =(a1a2……an+b1b2……bm/(10^m-1))/10^n // =(a1a2……an*(10^m-1)+b1b2……bm)/(10^m-1)*10^n // 说明: // (1)0.(b1b2……bm)表示:b1b2……bm无限循环,后面的等式类似。 // (2)0.(b1b2……bm)=b1b2……bm/(10^m-1)推导如下: // 令Y=0.(b1b2……bm) // 则:(10^m)*Y=b1b2……bm+0.(b1b2……bm) // (10^m-1)*Y= b1b2……bm // Y=b1b2……bm/(10^m-1) //*************************************
int gcd(int m,int n)
{
int gcd,t;
int x,y;
x=m>n?m:n;
y=m>n?n:m;
while(y!=0)
{
x=x%y;
t=x;
x=y;
y=t;
}
gcd=x;
return gcd;
}
int main()
{
char a[100];
int aLen=0;
while(scanf("%s",a)==1)
{
int dot; //小数点的位子 int Infinite=-1; //无限小数左括号位子
aLen=strlen(a);
for(int i=0;i<aLen;i++)
{
if(a[i]=='.') dot=i;
if(a[i]=='(') Infinite=i;
}
//
//有限小数的处理方式
//
if(Infinite==-1)
{
char result1[100];
int count=0;
for(int i=0;i<aLen;i++)
{
if(a[i]!='.')
{
result1[count++]=a[i];
}
}
int fz=0,fm=0,gcd1=1;
for(int i=count-1;i>=0;i--)
{
fz+=(result1[i]-48)*(pow(10.0,count-1-i));
}
fm=pow(10.0,aLen-(dot+1));
gcd1=gcd(fz,fm);
fz=fz/gcd1;
fm=fm/gcd1;
printf("%d/%d\n",fz,fm);
}
//
//无限小数:只是0~1之内的小数
//X=(a1a2……an*(10^m-1)+b1b2……bm)/(10^m-1)*10^n
else{
int n,m; //n:a1~an;m:b1~bm;
n=Infinite-(dot+1);
m=aLen-1-(Infinite+1);
int fz=0,fm=0,gcd2=1;
for(int i=dot+1;i<Infinite;i++)
{
fz+=(a[i]-48)*(pow(10.0,n-i+dot));
}
fz=fz*(pow(10.0,m)-1);
for(int i=Infinite+1;i<aLen-1;i++)
{
fz+=(a[i]-48)*(pow(10.0,m-i+Infinite));
}
fm=(pow(10.0,m)-1)*pow(10.0,n);
gcd2=gcd(fz,fm);
fz=fz/gcd2;
fm=fm/gcd2;
printf("%d/%d\n",fz,fm);
}
}
return 0;
}
|