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



  • 相关阅读:
    创建Variant数组
    ASP与存储过程(Stored Procedures)
    FileSystemObject对象成员概要
    Kotlin 朱涛9 委托 代理 懒加载 Delegate
    Kotlin 朱涛 思维4 空安全思维 平台类型 非空断言
    Kotlin 朱涛7 高阶函数 函数类型 Lambda SAM
    Kotlin 朱涛16 协程 生命周期 Job 结构化并发
    Proxy 代理模式 动态代理 cglib MD
    RxJava 设计理念 观察者模式 Observable lambdas MD
    动态图片 Movie androidgifdrawable GifView
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256457.html
Copyright © 2011-2022 走看看