前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1034 有理数四则运算 (20 分)

1034 有理数四则运算 (20 分)

作者头像
可爱见见
发布2019-09-19 18:17:06
6900
发布2019-09-19 18:17:06
举报
文章被收录于专栏:卡尼慕

1034 有理数四则运算 (20 分)

本题要求编写程序,计算 2 个有理数的和、差、积、商。

输入格式:

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

输出格式:

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

输入样例 1:

代码语言:javascript
复制
2/3 -4/2

输出样例 1:

代码语言:javascript
复制
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)

输入样例 2:

代码语言:javascript
复制
5/3 0/6

输出样例 2:

代码语言:javascript
复制
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

【我的代码】

代码语言:javascript
复制
// 1034 有理数四则运算 (20 分).cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <cstdio>
using namespace std;
//求最大公约数
int gcd(long long a, long long b) {
    return b == 0 ? a : gcd(b, a % b);
}
//打印一个数
void print(long long a_1, long long a_2) {
    long long b = 0;
    if (a_1 > 0) {
        //正数
        if (a_2 == 1)
            cout << a_1;
        else if(a_1 > a_2){
            //分子比分母大
            b = a_1 / a_2;
            a_1 -= a_2 * b;
            cout << b << " " << a_1 << "/" << a_2;
        }
        else {
            //无需化简
            cout << a_1 << "/" << a_2;
        }
    }
    else if (a_1 == 0) {
        cout << 0;
    }
    else {
        //负数
        if (a_2 == 1)
            cout << "(" << a_1 << ")";
        else if (-1 * a_1 > a_2) {
            b = a_1 / a_2;
            a_1 = (-1 * a_1) % a_2;
            cout << "(" << b << " " << a_1 << "/" << a_2 << ")";
        }
        else {
            //无需化简
            cout << "(" << a_1 << "/" << a_2 << ")";
        }
    }
}
//减法
void sub(long long a_1, long long a_2, long long b_1, long long b_2) {
    print(a_1, a_2);
    cout << " " << "-" << " ";
    print(b_1, b_2);
    cout << " " << "=" << " ";;
    long long c_1 = a_1 * b_2 - a_2 * b_1;
    long long c_2 = a_2 * b_2;
    long long c = abs(gcd(c_1, c_2));
    c_1 /= c;
    c_2 /= c;
    print(c_1, c_2);
}
//加法
void add(long long a_1, long long a_2, long long b_1, long long b_2) {
    print(a_1, a_2);
    cout << " " << "+" << " ";
    print(b_1, b_2);
    cout << " " << "=" << " ";;
    long long c_1 = a_1 * b_2 + a_2 * b_1;
    long long c_2 = a_2 * b_2;
    long long c = abs(gcd(c_1, c_2));
    c_1 /= c;
    c_2 /= c;
    print(c_1, c_2);
}
//乘法
void mult(long long a_1, long long a_2, long long b_1, long long b_2) {
    print(a_1, a_2);
    cout << " " << "*" << " ";
    print(b_1, b_2);
    cout << " " << "=" << " ";;
    long long c_1 = a_1 * b_1;
    long long c_2 = a_2 * b_2;
    long long c = abs(gcd(c_1, c_2));
    c_1 /= c;
    c_2 /= c;
    print(c_1, c_2);
}
//除法
void div(long long a_1, long long a_2, long long b_1, long long b_2) {
    print(a_1, a_2);
    cout << " " << "/" << " ";
    print(b_1, b_2);
    cout << " " << "=" << " ";
    if (!b_1) {
        cout << "Inf";
        return;
    }
    else if (b_1 < 0) {
        long long c_1 = -1 * a_1 * b_2;
        long long c_2 = -1 * a_2 * b_1;
        long long c = abs(gcd(c_1, c_2));
        c_1 /= c;
        c_2 /= c;
        print(c_1, c_2);
    }
    else {
        long long c_1 = a_1 * b_2;
        long long c_2 = a_2 * b_1;
        long long c = abs(gcd(c_1, c_2));
        c_1 /= c;
        c_2 /= c;
        print(c_1, c_2);
    }
}
int main()
{
    //输入
    long long a_1, a_2, b_1, b_2;
    scanf_s("%lld/%lld %lld/%lld", &a_1, &a_2, &b_1, &b_2);

    //把a,b化到最简
    long long num_1 = abs(gcd(a_1, a_2));//得到a的最大公约数
    a_1 /= num_1;
    a_2 /= num_1;
    long long num_2 = abs(gcd(b_1, b_2));//得到b的最大公约数
    b_1 /= num_2;
    b_2 /= num_2;

    //计算
    add(a_1, a_2, b_1, b_2);
    cout << endl;
    sub(a_1, a_2, b_1, b_2);
    cout << endl;
    mult(a_1, a_2, b_1, b_2);
    cout << endl;
    div(a_1, a_2, b_1, b_2);
    return 0;
}

【思路】

  1. 所有的数都要是化简后的,因此需要单独分离一个函数作为化简函数,这里参考了辗转相除法,找到最大公约数,然后分子分母同时除最大共约数,得到最简化的分式。
  2. 发现数字化简到分式后还要化成分子比分母小的形式(忘记怎么叫了),因此这里需要一个格式转换函数,就写了一个print函数,对分子大于0,小于0和等于0进行讨论。
  3. +、-、*都是直接对分子分母进行操作,这里不需要考虑化简问题,因为我们有单独出来的化简函数。而除法需要注意!!Inf的情况。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卡尼慕 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 输入格式:
  • 输出格式:
  • 输入样例 1:
  • 输出样例 1:
  • 输入样例 2:
  • 输出样例 2:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档