• HDU 小数化分数 1717


    小数化分数2

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 3364 Accepted Submission(s): 1232
     
    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
     


    方法:

    将纯循环小数改写成分数,分子是一个循环节的数字组成的数;分母各位数字都是9,9的个数与循环节中的数字的个数相同.
    将混循环小数改写成分数,分子是不循环部分与第一个循环节连成的数字组成的数,减去不循环部分数字组成的数之差;分母的头几位数字是9,末几位数字是0,9的个数跟循环节的数位相同,0的个数跟不循环部分的数位相同.。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int gcd(int m,int n){
        return n==0?m:gcd(n,m%n);
       }
    int main()
    {   char str[20];
        int cyc,uncyc,len,i,up,down,ans,d,y,x,k,l,flag,sum;
        int cycandun; //非循环和循环部分总的数位
        int T;
        cin>>T;
        while(T--){
    
            cyc=0,uncyc=0,len=0,up=0,down=0,sum=0,cycandun=0;
            y=1,x=0,k=1,l=1;
            flag=1;
            scanf("%s",str);
            len=strlen(str);
            for(i=2;i<=len-1;i++){
    
                if(str[i]!='('&&flag){
                    uncyc++;
                    x+=str[i]-'0';
                    if(str[i+1]!='('&&i!=len-1)
                    x*=10;
                    }
                else if(str[i]=='(')
                    flag=0;
                    if(str[i]!=')'&&str[i]!='('){
                        cycandun++;
                        sum+=str[i]-'0';
                        if(str[i+1]!=')')
                        sum*=10;
                    }
            }
                    if((cycandun-uncyc)==0){  //cycandun-uncycy=0的话,就是没有循环部分的情况了
                            sum=1;
                            while(uncyc--)
                            sum*=10;
                     d=gcd(x,sum);
                     cout<<x/d<<"/"<<sum/d<<endl;
                    }
    
                    else{
                    up=sum-x;
                    while(cycandun--)
                        k*=10;
                    while(uncyc--)
                        l*=10;
                    down=k-l;
                   d=gcd(up,down);
            cout<<up/d<<"/"<<down/d<<endl;;}
    
        }
        return 0;
    }
    
    网上看到了一种风格不同的做法
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    char a[20];
    int gcd(int a,int b)
    {
        return b==0?a:gcd(b,a%b);
    }
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            int i,j,k,n,p,q,d;
            cin>>a;
            n=strlen(a);
            for(i=2;i<n;i++)
                if(a[i]=='(')break; //记录非循环部分的数位
            if(i>=n)   //用来区分非循环小数和带括号的循环小数,分开处理更快
            {
                p=0,q=1;
                for(i=2;i<n;i++)
                {
                   p=p*10+a[i]-'0';
                   q=q*10;
                }
                d=gcd(p,q);
                cout<<p/d<<"/"<<q/d<<endl;
            }
            else
            {
                int x=1,y=0;
                p=1;
                q=0;
                for(i=2;i<n;i++)
                {
                    if(a[i]=='(')break;
                    y=y*10+a[i]-'0';
                }
                for(j=i+1;j<n-1;j++)p=p*10;
                p--;
                for(i=2;i<n-1;i++)
                {
                    if(a[i]=='('){p=p*x;continue;} //与网上大多用相减的方法得到分母的方法迥异!
                    x*=10;
                    q=q*10+a[i]-'0';
                }
                q=q-y;
                d=gcd(p,q);
                cout<<q/d<<"/"<<p/d<<endl;
            }
        }
        return 0;
    }
    



  • 相关阅读:
    Centos7安装docker
    Centos 7快速安装之packstack
    mysql基础知识复习
    Linux系统部署samba服务记录
    简单python程序练习
    Docker 搭建pxc集群 + haproxy + keepalived 高可用(二)
    Docker 搭建pxc集群 + haproxy + keepalived 高可用(一)
    linux下的find文件查找命令与grep文件内容查找命令
    db2创建nickname
    oracle 启动报ORA-01105 ORA-19808
  • 原文地址:https://www.cnblogs.com/mingrigongchang/p/6246308.html
Copyright © 2020-2023  润新知