HDACM218 小数转分数

纯循环小数0.99.......=1
纯循环小数0.x……,如果x有n位则
0.x……=x/[99……9(n位)]
比如0.142857142857……=142857/999999=1/7
混循环小数0.xy……其中y是循环节
假设x有m位,y有n位则
0.xy……=(xy-x)/[99……9(n位)00……0(m位)]
比如0.21231231231231……=(21231-21)/99900=21210/99900=707/3330


# include<stdio.h>

int gcd(int a,int b)

{


    int temp;


    while(a%b!=0)


    {


        temp=a%b;


        a=b;


        b=temp;


    }


    return b;


}


int main()


{


    int i,ncase,ans,p,q,t,m,n,x,y,k,l;


    char ch[25];


    scanf("%d",&ncase);


    while(ncase--)


    {


        scanf("%s",ch);


        x=0;


        t=0;


        p=0;


        q=0;


        k=1;l=1;


        for(i=2;ch[i]!=0;i++)


        {


            if(t==0 && ch[i]!='(') 


            {


                p++;


                x*=10;


                x+=ch[i]-'0';


            }


            if(t==1&& ch[i]!=')')


            {


                q++;


                y*=10;


                y+=ch[i]-'0';


            }


            if(ch[i]=='(') {t=1;y=x;q=p;}


        }


        if(q==0)


        {


            while(p--)


                k*=10;


            ans=gcd(x,k);


            x/=ans;


            k/=ans;


            printf("%d/%d\n",x,k);


        }


        else


        {


            m=y-x;


            while(p--)


                k*=10;


            while(q--)


                l*=10;


            n=l-k;


            ans=gcd(m,n);


            m/=ans;


            n/=ans;


            printf("%d/%d\n",m,n);


        }


    }


    return 0;


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值