A1088.Rational Arithmetic

Posted western-trail

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A1088.Rational Arithmetic相关的知识,希望对你有一定的参考价值。

题意

模拟分数的四则运算

思路分析

模拟,在输出过程中,若分子>分母,需要分离出整数部分与分数部分,并且如果项为负数需要带上()

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct fraction{
    ll up;  //分子 
    ll down;        //分母 
}a,b,result;

ll gcd(ll a,ll b){
    if(b == 0) return a;
    else return gcd(b,a%b); 
}

fraction simply(fraction a){            //对分子分母进行约分 
    if(a.down < 0) {            //如果输入分母是负数,统一为分子带符号,分母不带符号 
        a.up = -a.up;
        a.down = - a.down;
    }
    int GCD = gcd(abs(a.up),abs(a.down));
    a.up /= GCD;
    a.down /= GCD;
    return a;
}

void showResult(fraction a){
    a = simply(a);          //对a化简  
    if(a.up < 0) printf("(");           //如果是负数 
    if(a.down == 1) printf("%lld",a.up);            //如果分母为1 
    else if(a.up == 0) printf("0");             //如果分子为0 
    else if(abs(a.up) > abs(a.down))            //如果分子>分母,需要输出整数部分 
        printf("%lld %lld/%lld",a.up/a.down,abs(a.up) % a.down,a.down);
    else if(abs(a.up) == abs(a.down)) printf("%d",a.up/a.down);         //分子=分母 
    else 
        printf("%lld/%lld",a.up,a.down);            //分子<分母 
    if(a.up < 0) printf(")");
}

fraction Sum(fraction a,fraction b){
    result.up = a.up * b.down + a.down * b.up;
    result.down = a.down * b.down;
    return simply(result);
}

fraction Mul(fraction a,fraction b) {
    result.up = a.up * b.up;
    result.down = a.down * b.down;
    return simply(result);
}

fraction Del(fraction a,fraction b) {
    result.up = a.up * b.down - a.down * b.up;
    result.down = a.down * b.down;
    return simply(result);
}

fraction div(fraction a,fraction b) {
    result.up = a.up * b.down;
    result.down = a.down * b.up;
    return simply(result);
}

int main(void){
    scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);
    //加法 
    showResult(a);
    printf(" + ");
    showResult(b);
    printf(" = ");
    showResult(Sum(a,b));
    cout<<endl;
    
    //减法
    showResult(a);
    printf(" - ");
    showResult(b);
    printf(" = ");
    showResult(Del(a,b));   
    cout<<endl;
    
    //乘法
    showResult(a);
    printf(" * ");
    showResult(b);
    printf(" = ");
    showResult(Mul(a,b)); 
    cout<<endl;
    //除法
    showResult(a);
    printf(" / ");
    showResult(b);
    printf(" = ");
    if(b.up == 0) cout<<"Inf";
    else showResult(div(a,b)); 
    return 0;
}

总结

PAT 第一道题20分就这么难,这还考个球啊。屎山模拟,恶心到吐血,考虑细节较多

以上是关于A1088.Rational Arithmetic的主要内容,如果未能解决你的问题,请参考以下文章

A1088.Rational Arithmetic

1088 Rational Arithmetic(20 分)

1088 Rational Arithmetic

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

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

PAT甲级1088 Rational Arithmetic (20 分)