IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【PTA-乙级】1034-有理数四则运算 -> 正文阅读

[C++知识库]【PTA-乙级】1034-有理数四则运算

阿这...从输入ctrl+v这个图片到写出这几句话,又看了若干时间手机= =

先给出我写出的解法吧

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

void huajian(long long& a, long long& b)
{
    // 比如 8 6 ;
    // 先求最大公约数 2 
    long long x = a;
    long long y = b;
    if (x < y)
        swap(x, y);
    long long z;
    while(x%y)
    {
        z=x%y;
        x=y;
        y=z;
    }
    a/=y;
    b/=y;
}

void print(long long a, long long b)
{
    // 考虑到加减乘除 加: 按那种方式 分母一定不为0 分子为正则为正 分子为负则为负 
    // 考虑减: 分母一定不为0且为正 分子还是正常  考虑乘 :分母正,分子正常 
    // 考虑除: 分子分母都有可能为负 若都是负 则为正 若一方为负 则为负 且一方为0则为Inf
    // 综上 也就是 加减乘都是看分子 为正则为正 除的话 若一方为负才为负 所以是否带负号还是看相乘的结果

    // 现在考虑0: 若打印等号左边的 : 第一个为0则打印0  运算后的:除:若右边为0则为INF
    if (!b)
    {
        cout << "Inf";
        return;
    }

    if (!a)
    {
        cout << "0";
        return;
    }
    //if (a == 0 || b == 0)
    //{
    //    printf("%s", !b ? "Inf" : "0");
    //}

    // -4 2
    // 下面的也就是ab都不为0
    bool prime = ((a < 0 && b > 0) || (a > 0 && b < 0));
    if (prime)
        printf("(-");
    long long x = fabs(a);
    long long y = fabs(b);
    huajian(x, y);
    long long z = x / y;
    int flag = 0;
    if (z) //z不是0则输出
    {
        cout << z;
        flag = 1;  //只有左边输出且右边输出才输出中间的空格
    }
    x %= y;
    if (x&&flag)
        printf(" %d/%d", x, y);
    else if(x&&!flag)
        printf("%d/%d", x, y);
    if (prime)
        printf(")");
}

int main()
{
    long long a, b, c, d;
    scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
    //  2/3 -4/2
    print(a, b); printf(" + "); print(c, d); printf(" = "); print(a*d+b*c,b*d); printf("\n");
    print(a, b); printf(" - "); print(c, d); printf(" = "); print(a*d-b*c,b*d); printf("\n");
    print(a, b); printf(" * "); print(c, d); printf(" = "); print(a*c,b*d); printf("\n");
    print(a, b); printf(" / "); print(c, d); printf(" = "); print(a*d,b*c);
    return 0;
}

下面这个输出方式是我最开始没想到的,且我都不知道怎么实现这样的两个分数的相加减等等。就很无语。在print函数前几行,是我思考的一些好像没必要思考的东西。我在思考加减乘除的各种情况。最后发现好像没有什么意义= =

1. 注意这个scanf的使用。对于某些数据输入时很方便。

2.? 注意分数的相加减乘除(开始时我不知道)

3.? 若分母为0则输出Inf,分子为0则输出0;(可不经过其他那些没必要的思考直接得出这个结论)

4.? 两个不超过整型的数字相乘可能会超出整形的范围,所以,定义为longlong,且函数中判断这个分数正负时,不能用if(a*b<0)的形式,因为可能会超出longlong的范围。建议任何可能会溢出的地方,都提高数据的存储单位。

5.? 总结起来,写函数时需要注意的点1. 正还是负? 2. 分母或分子是否为0? 3. 是否有整数要输出? 4.后面是否有分数要输出??

6.? 化简时,即找最大公因数时,建议用如上方法,刚试了,若用逐一遍历的方法,容易超时。

柳神的代码

#include <iostream>
#include <cmath>
using namespace std;
long long a, b, c, d;
long long gcd(long long t1, long long t2) {
    return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}
void func(long long m, long long n) {
    if (m * n == 0) {
        printf("%s", n == 0 ? "Inf" : "0");
        return ;
    }
    bool flag = ((m < 0 && n > 0) || (m > 0 && n < 0));
    m = abs(m); n = abs(n);
    long long x = m / n;
    printf("%s", flag ? "(-" : "");
    if (x != 0) printf("%lld", x);
    if (m % n == 0) {
        if(flag) printf(")");
        return ;
    }
    if (x != 0) printf(" ");
    m = m - x * n;
    long long t = gcd(m, n);
    m = m / t; n = n / t;
    printf("%lld/%lld%s", m, n, flag ? ")" : "");
}
int main() {
    scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
    func(a, b); printf(" + "); func(c, d); printf(" = "); func(a * d + b * c, b * d); printf("\n");
    func(a, b); printf(" - "); func(c, d); printf(" = "); func(a * d - b * c, b * d); printf("\n");
    func(a, b); printf(" * "); func(c, d); printf(" = "); func(a * c, b * d); printf("\n");
    func(a, b); printf(" / "); func(c, d); printf(" = "); func(a * d, b * c);
    return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-09 20:30:33  更:2022-02-09 20:31:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:54:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码