ACM Steps 2.1.8

小数化分数2   Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)  Total Submission(s): 3420 Accepted Submission(s): 1258 

Problem Description

Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢? 请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。

Input

第一行是一个整数N,表示有多少组数据。 每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。

Output

对每一个对应的小数化成最简分数后输出,占一行。

Sample Input

3 0.(4) 0.5 0.32(692307)

Sample Output

4/9 1/2 17/52

   

Source

2007省赛集训队练习赛(2)

Recommend

lcy 思路: 小数化分数,从别人那里学来的简便方法。 有限小数: 乘以10^n/10^n,再化简,很简单。 纯无限循环小数: 例如0.(4),括号表示循环部分,分子为循环部分,分母为循环部分的数都换成9,0.(4)=4/9, 0.(abcd)=abcd/9999。; 混合无限循环小数: 例如0.32(692307),分子为有限部分连接上循环部分得到的数减去有限部分,分母为循环部分的数都换成9再连接上有限部分 的都数换成0的数,0.32(692307)=(32692307-32)/99999900。

代码:

#include<iostream>
#include<string>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iomanip>
using namespace std;

int main()

{

    int t;

    string s;

    scanf("%d",&t);

    while(t--)

    {

        cin>>s;

        int flag=0,a=0,b=0,A=0,B=0;

        int k=s.size();

        for(int i=2;i<k;i++)

        {

            if(s[i]=='('&&i==2)

            {

                flag=1;

            }

            else if(s[i]=='('&&i!=2)

            {

                flag=2;

            }

            if(flag==0)

            {

                a=a*10+s[i]-'0';

                A++;

            }

            if(flag!=0&&s[i]>='0'&&s[i]<='9')

            {

                b=b*10+s[i]-'0';

                B++;

            }

        }

        if(flag==0)

        {

            int n=a,m=pow(10,A);

            A=m;

            while(A%a!=0)

            {

                int r=A%a;

                A=a;

                a=r;

            }

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

        }

        else if(flag==1)

        {

             int n=b,m=pow(10,B)-1;

            B=m;

            while(B%b!=0)

            {

                int r=B%b;

                B=b;

                b=r;

            }

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

        }

        else if(flag==2)

        {

            int n=a*pow(10,B)+b-a,m=(pow(10,B)-1)*pow(10,A);

            b=n;B=m;

            while(B%b!=0)

            {

                int r=B%b;

                B=b;

                b=r;

            }

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

        }

    }

     return 0;

}

原文地址:https://www.cnblogs.com/--ZHIYUAN/p/5716746.html