zoukankan      html  css  js  c++  java
  • 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;

    }

  • 相关阅读:
    睡眠错误
    Linux中安装Mysql授权远程访问
    lamp安装
    MySQL 数据类型(Day41)
    MySQL 表操作 (Day40)
    MySQL之存储引擎(Day39)
    MySQL下载安装
    python并发编程之IO模型(Day38)
    同步锁,死锁现象与递归锁,信息量Semaphore.....(Day36)
    多线程并发练习(Day35)
  • 原文地址:https://www.cnblogs.com/--ZHIYUAN/p/5716746.html
Copyright © 2011-2022 走看看