女朋友都能看懂的题解:PAT乙级1034 有理数四则运算 (20分)(函数式编程)

原题链接https://pintia.cn/problem-sets/994805260223102976/problems/994805287624491008
1034 有理数四则运算 (20分)
本题要求编写程序,计算 2 个有理数的和、差、积、商。

输入格式:
输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。

输出格式:
分别在 4 行中按照 有理数1 运算符 有理数2 = 结果 的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b,其中 k 是整数部分,a/b 是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf。题目保证正确的输出中没有超过整型范围的整数。

输入样例 1:
2/3 -4/2

输出样例 1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)

输入样例 2:
5/3 0/6

输出样例 2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

分析:
此题需要模拟小学的分数加减乘除,同时需要注意以下几点:
1.格式问题:要化成假分数形式,而且负数还要加括号。
2.要用long long 型防止溢出。
3.尽量多用函数,避免重复操作。

#include<bits/stdc++.h>
using namespace std;
long long gcd(long long a,long long b){//辗转相除法+递归
   return b==0?a:gcd(b,a%b);
}
void simplify(long long &a,long long &b){//分数化简
  long long t=gcd(a,b);
  a/=t;b/=t;
}
void print2(long long a,long long b,long long x,long long y){//a,b,x,y全变成非负数后的输出函数
 if(x==0&&y!=0)cout<<y<<"/"<<b;
 else if(x!=0&&y==0)cout<<x;
 else if(x!=0&&y!=0)cout<<x<<" "<<y<<"/"<<b;
}

void print(long long a,long long b)
{
    if(b==0)cout<<"Inf";//先处理0的情况
    else if(a==0)cout<<"0";
    else{
        simplify(a,b);
        int flag=0;
        if((a>0&&b<0)||(a<0&&b>0))flag=1;//判断符号,控制格式
        a=fabs(a);b=fabs(b);//为了避免负数取模,先全变成整数
        long long x=a/b,y=a%b;
        if(flag==0)print2(a,b,x,y);
        else{
            cout<<"(-";
            print2(a,b,x,y);
            cout<<")";
        }
    }
}
int main()
{
    long long a,b,c,d;
    scanf("%lld/%lld %lld/%lld",&a,&b,&c,&d);
    print(a,b);cout<<" + ";print(c,d);cout<<" = ";print(a*d+b*c,b*d);cout<<endl;
    print(a,b);cout<<" - ";print(c,d);cout<<" = ";print(a*d-b*c,b*d);cout<<endl;
    print(a,b);cout<<" * ";print(c,d);cout<<" = ";print(a*c,b*d);cout<<endl;
    print(a,b);cout<<" / ";print(c,d);cout<<" = ";print(a*d,b*c);cout<<endl;
    return 0;
}

发布了11 篇原创文章 · 获赞 4 · 访问量 160

猜你喜欢

转载自blog.csdn.net/tongjingqi_/article/details/105616841