PAT 1034 有理数四则运算

题目链接 1034 有理数四则运算

本题要求编写程序,计算 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. 分数要化简 5/3 -----> 1 2/3 ; 4/2------->2
  2. 负数要加括号 (-2)
  3. 除数为0要输出Inf

题解

  1. 编写化简函数

    void simplify(ll int n,ll int m){
        if(n%m == 0) { //可以整除
            if(n<0) cout<<"("<<n/m<<")";
            else cout<<n/m;
            return ;
        }
        if(abs(n) > abs(m) ){//分子比分母大
            ll int temp = n/m;
            n = n-temp*m;
            if(n<0) {//负数加括号
                cout<<"("<<temp<<" ";
                simplify(abs(n),m);
                cout<<")";
            }
            else{
                cout<<temp<<" ";
                simplify(n,m);
            }
            return ;
        }
        //普通情况
        ll int h = __gcd(abs(n),abs(m));//求公约数
        n /= h;
        m /= h;
        if(n<0) cout<<"("<<n<<"/"<<m<<")";
        else cout<<n<<"/"<<m;
    }
    
  2. 然后分别进行加减乘除就可以了

  3. 除法时进行分母是否为0的特判

  4. 计算过程中可能会爆int 要用long long

完整代码

#include<iostream>
#include <algorithm>
using namespace std;

#define ll long long
	void simplify(ll int n,ll int m){
	    if(n%m == 0) { //可以整除
	        if(n<0) cout<<"("<<n/m<<")";
	        else cout<<n/m;
	        return ;
	    }
	    if(abs(n) > abs(m) ){//分子比分母大
	        ll int temp = n/m;
	        n = n-temp*m;
	        if(n<0) {//负数加括号
	            cout<<"("<<temp<<" ";
	            simplify(abs(n),m);
	            cout<<")";
	        }
	        else{
	            cout<<temp<<" ";
	            simplify(n,m);
	        }
	        return ;
	    }
	    //普通情况
	    ll int h = __gcd(abs(n),abs(m));//求公约数
	    n /= h;
	    m /= h;
	    if(n<0) cout<<"("<<n<<"/"<<m<<")";
	    else cout<<n<<"/"<<m;
	}
int main()
{
    ll int nums[100];//输入
    scanf("%lld/%lld",&nums[0],&nums[1]);
    scanf("%lld/%lld",&nums[2],&nums[3]);

    ll int up=0,down=0;//分子和分母
    up = nums[0]*nums[3]+nums[2]*nums[1];
    down = nums[1]*nums[3];
    simplify(nums[0],nums[1]);
    cout<<" + ";
    simplify(nums[2],nums[3]);
    cout<<" = ";
    simplify(up,down);
    cout<<"\n";

    up = nums[0]*nums[3]-nums[2]*nums[1];
    down = nums[1]*nums[3];
    simplify(nums[0],nums[1]);
    cout<<" - ";
    simplify(nums[2],nums[3]);
    cout<<" = ";
    simplify(up,down);
    cout<<"\n";


    up = nums[0]*nums[2];
    down = nums[1]*nums[3];
    simplify(nums[0],nums[1]);
    cout<<" * ";
    simplify(nums[2],nums[3]);
    cout<<" = ";
    simplify(up,down);
    cout<<"\n";

    if(nums[2] != 0) {//除法特判
        up = nums[0] * nums[3];
        down = nums[1] * nums[2];
        if (down < 0) {
            down *= -1;
            up *= -1;
        }
        simplify(nums[0], nums[1]);
        cout << " / ";
        simplify(nums[2], nums[3]);
        cout << " = ";
        simplify(up,down);
    }
    else{
        simplify(nums[0], nums[1]);
        cout << " / ";
        simplify(nums[2], nums[3]);
        cout << " = ";
        cout<<"Inf";
    }
    return 0;
}
### 关于复数四则运算的PTA编程题解或练习 针对复数四则运算,在PAT平台上的确存在相应的编程题目,这些题目旨在帮助学生巩固基础知识并提升对特定功能模块的应用能力。这类题目通常会考察如何定义复数类及其基本操作方法,包括加减乘除等运算逻辑实现。 #### 定义复数类与实现四则运算 为了完成此类题目,建议先创建一个`Complex`类来表示复数对象,并重载算术运算符以支持常见的数学计算: ```cpp class Complex { public: double real; // 实部 double imag; // 虚部 Complex(double r=0, double i=0):real(r),imag(i){} // 加法运算 Complex operator+(const Complex& c){ return Complex(real+c.real, imag+c.imag); } // 减法运算 Complex operator-(const Complex& c){ return Complex(real-c.real, imag-c.imag); } // 乘法运算 Complex operator*(const Complex& c){ return Complex(real*c.real-imag*c.imag, real*c.imag+imag*c.real); } // 除法运算 Complex operator/(const Complex& c){ double denom = c.real * c.real + c.imag * c.imag; return Complex((real*c.real + imag*c.imag)/denom, (imag*c.real - real*c.imag)/denom); } }; ``` 上述代码展示了如何通过面向对象的方式处理复数之间的各种运算[^1]。 #### 练习资源推荐 对于希望进一步加强这方面技能的学习者而言,除了官方提供的题库外,还可以参考其他在线评测系统的相似题目来进行额外训练。值得注意的是,虽然PAT乙级主要侧重于STL和其他基础概念的理解和应用[^2],但在实际考试或者日常学习过程中遇到涉及复杂数字的操作也是完全有可能的。因此,适当增加这方面的练习有助于全面提升个人的技术栈[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值