zoukankan      html  css  js  c++  java
  • PAT甲题题解-1088. Rational Arithmetic (20)-模拟分数计算

    输入为两个分数,让你计算+,-,*,四种结果,并且输出对应的式子,分数要按带分数的格式k a/b输出
    如果为负数,则带分数两边要有括号
    如果除数为0,则式子中的结果输出Inf
    模拟题最好自己动手实现,考验细节处理,其它没啥好说的。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    long long numerator[2];
    long long denominator[2];
    long long GCD(long long a,long long b){
        a=abs(a);
        b=abs(b);
        if(b==0)
            return a;
        return GCD(b,a%b);
    
    }
    struct Fraction{
        long long integer;
        long long numerator;
        long long denominator;
    }frac[3];
    /**
    转化成带分数的形式
    */
    void transfer(long long numerator,long long denominator,int i){
        //long long gcd=GCD(numerator,denominator);
        //numerator=numerator/gcd;
        //denominator=denominator/gcd;
        frac[i].integer=numerator/denominator;
        frac[i].numerator=numerator%denominator;
        frac[i].denominator=denominator;
    }
    /**
    输出,如果为负数还要有括号
    */
    void print(Fraction f){
        if(f.integer!=0){
            if(f.integer<0)
                printf("(");
            printf("%lld",f.integer);
        }
    
        if(f.numerator!=0){
            if(f.integer!=0){
                printf(" ");
            }
            //如果前面整数部分为0,则这里需要加(
            else if(f.numerator<0)
                printf("(-");
            //注意,如果是负数,只要整数前面一个'-'就可以,所以这里不需要'-'
            if(f.numerator>0)
                printf("%lld/%lld",f.numerator,f.denominator);
            else
                printf("%lld/%lld",-f.numerator,f.denominator);
        }
        if(f.integer==0&&f.numerator==0)
            printf("0");
        else if(f.integer<0 || f.numerator<0)
            printf(")"); //末尾补)
    }
    
    
    int main()
    {
        long long res;
        scanf("%lld/%lld %lld/%lld",&numerator[0],&denominator[0],&numerator[1],&denominator[1]);
        //先约分
        long long gcd0=GCD(numerator[0],denominator[0]);
        numerator[0]=numerator[0]/gcd0;
        denominator[0]=denominator[0]/gcd0;
        long long gcd1=GCD(numerator[1],denominator[1]);
    
        numerator[1]=numerator[1]/gcd1;
        denominator[1]=denominator[1]/gcd1;
    
        long long gcd=GCD(denominator[0],denominator[1]);
        long long lcm=(denominator[0]/gcd)*gcd*(denominator[1]/gcd);
        transfer(numerator[0],denominator[0],0);
        transfer(numerator[1],denominator[1],1);
        //sum
        long long sum=numerator[0]*(lcm/denominator[0])+numerator[1]*(lcm/denominator[1]);
        long long gcd2=abs(GCD(sum,lcm));
        transfer(sum/gcd2,lcm/gcd2,2);
        print(frac[0]);
        printf(" + ");
        print(frac[1]);
        printf(" = ");
        print(frac[2]);
        printf("
    ");
    
        //difference
        sum=numerator[0]*(lcm/denominator[0])-numerator[1]*(lcm/denominator[1]);
        gcd2=abs(GCD(sum,lcm));
        transfer(sum/gcd2,lcm/gcd2,2);
        print(frac[0]);
        printf(" - ");
        print(frac[1]);
        printf(" = ");
        print(frac[2]);
        printf("
    ");
    
        //product
        sum=numerator[0]*numerator[1];
        res=denominator[0]*denominator[1];
        gcd2=abs(GCD(sum,res));
        transfer(sum/gcd2,res/gcd2,2);
        print(frac[0]);
        printf(" * ");
        print(frac[1]);
        printf(" = ");
        print(frac[2]);
        printf("
    ");
    
        //quotient
        print(frac[0]);
        printf(" / ");
        print(frac[1]);
        printf(" = ");
        if(numerator[1]==0){
            printf("Inf
    ");
        }
        else{
            sum=numerator[0]*denominator[1];
            res=denominator[0]*numerator[1];
            if(res<0){
                sum=-sum;
                res=-res;
            }
    
            gcd2=abs(GCD(sum,res));
            transfer(sum/gcd2,res/gcd2,2);
    
            print(frac[2]);
            printf("
    ");
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    Java正則表達式入门
    Effect of Switchovers, Failovers, and Control File Creation on Backups
    Android 屏幕截图(底层实现方式)
    Java实现奇偶数排序
    Java实现奇偶数排序
    Java实现奇偶数排序
    Java实现找零问题
    Java实现找零问题
    Java实现找零问题
    Java实现找零问题
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6780891.html
Copyright © 2011-2022 走看看