杭电1717:
比如说0.32(692307),设sum1=32,fm_sum1=100,sum2=692307,fm_sum2=999999.
满足如下公式:(sum1+sum2/fm_sum2)/fm_sum1;
通过在过程中不断约分,可以优化算法,代码如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
int func1(int *a,int k);
int func2(int l);
int func3(int l);
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
int main()
{
int T;
while(~scanf("%d",&T))
{
while(T--){
char n[100];
int j=0,i,a[100]={0},k=0,b[100]={0};
scanf("%s",n);
for(i=2;i<strlen(n);i++){
if(n[i]=='('){
for(int z=i+1;n[z]!=')';z++){
a[k++]=n[z]-'0';
}
}
if(k){
break;
}
b[j++]=n[i]-'0';
}
int sum2=func1(a,k);
int sum1=func1(b,j);
int fm_sum2=func2(k);
int fm_sum1=func3(j);
int t =gcd(sum2,fm_sum2);
sum2/=t;fm_sum2/=t;
int fz=sum1*fm_sum2+sum2;
int fm=fm_sum2*fm_sum1;
t=gcd(fz,fm);
fz/=t;fm/=t;
printf("%d/%d\n",fz,fm);
}
}
return 0;
}
int func1(int *a,int k)
{
int i,sum=0;
for(i=0;i<k;i++){
sum += a[i]*pow(10,k-i-1);
}
return sum;
}
int func2(int l)
{
if(l==0){
return 1;
}
l--;
int sum=9;
while(l--){
sum=sum*10+9;
}
return sum;
}
int func3(int l)
{
int sum=1;
while(l--){
sum*=10;
}
return sum;
}