hdu 1717


题解:

想办法“剪掉”无限循环小数的“大尾巴”。策略就是用扩倍的方法,

把无限循环小数扩大十倍、一百倍或一千倍……使扩大后的无限循环小数与原无限循环小数的“大尾巴”完全相同,

然后这两个数相减,“大尾巴”不就剪掉了吗!我们来看两个例子:

⑴    把0.4747……和0.33……化成分数。

0.4747……×100=47.4747……   

0.4747……×100-0.4747……=47.4747……-0.4747……

(100-1)×0.4747……=47

即99×0.4747…… =47 

那么  0.4747……=47/99

⑵把0.4777……和0.325656……化成分数。

0.4777……×10=4.777……①

0.4777……×100=47.77……②

用②-①即得: 

0.4777……×90=47-4

所以, 0.4777……=43/90

#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
string s;
int gcd(int b,int c)
{
    int d=b%c;
    if(d==0)return c;
    else return gcd(c,d);
}
int main()
{
    int _case;
    int i;
    int sum,sumd,gc;
    scanf("%d",&_case);
    getchar();
    while(_case--)
    {
        s.clear();
        cin>>s;
        //cout<<s<<endl;
        sum=0;
        sumd=1;
        for(i=2;i<s.size();i++)//chun xiaoshu
        {
            if(s[i]!='(')
            {
                sum=sum*10+s[i]-'0';
                sumd*=10;
            }
            else break;
        }
        if(i==s.size())
        {
            if(sum==0)
            {
                printf("0\n");
                continue;
            }
            //printf("%d %d\n",sumd,sum);
            gc=gcd(sumd,sum);
            printf("%d/%d\n",sum/gc,sumd/gc);
        }
        else
        {

            int sumx=sum;
            int sumy=sumd;
            for(i=i+1;i<s.size();i++)
            {

                if(s[i]!=')')
                {
                    sum=sum*10+s[i]-'0';
                    //sumd*=10;
                    sumd*=10;
                    //sumy*=10;
                }
            }
            sum-=sumx;
            sumd-=sumy;
            //printf("#%d %d\n",sumd,sum);
            gc=gcd(sumd,sum);
            printf("%d/%d\n",sum/gc,sumd/gc);
        }
    }
    return 0;
}




原文地址:https://www.cnblogs.com/XDJjy/p/3095246.html