PAT甲题题解-1088. Rational Arithmetic (20)-模拟分数计算

Posted 辰曦~文若

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("\n");

    //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("\n");

    //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("\n");

    //quotient
    print(frac[0]);
    printf(" / ");
    print(frac[1]);
    printf(" = ");
    if(numerator[1]==0){
        printf("Inf\n");
    }
    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("\n");
    }

    return 0;
}
View Code

 




以上是关于PAT甲题题解-1088. Rational Arithmetic (20)-模拟分数计算的主要内容,如果未能解决你的问题,请参考以下文章

1088. Rational Arithmetic (20)——PAT (Advanced Level) Practise

1088. Rational Arithmetic (20)——PAT (Advanced Level) Practise

PAT甲级1088 Rational Arithmetic (20 分)

PAT (Advanced Level) 1088. Rational Arithmetic (20)

1088 Rational Arithmetic (20 分)难度: 简单 / 知识点: 模拟

PAT甲题题解-1075. PAT Judge (25)-排序