关于c++:patb1034-有理数的运算

8次阅读

共计 1600 个字符,预计需要花费 4 分钟才能阅读完成。

这道题能够说是我目前刷到的 patb 组里最麻烦的一道题

次要是带分数这玩意曾经记不清多少年都没碰过了,而且各种状况非常容易思考不全

最初靠本人也没写出个能全过的解,起初一看是数太大了而我全程都在用 int 的问题,能够说是百密一疏……

这里附上柳神的赏心悦目的 c ++ 解法,正文我写的,而后前面的解析由 chatglm4 生成,不便了解。

#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(" "); // x 不为 0,则输入空格 (且整数的状况已在后面提前返回,不会运行到这)
    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"); // 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 * c, b * d);
    printf("\n");
    func(a, b);
    printf("/");
    func(c, d);
    printf("=");
    func(a * d, b * c);
    return 0;
}

这段代码是一个 C ++ 程序,用于解决分数的加减乘除运算,并且输入后果。程序首先定义了一个计算最大公约数的函数 gcd,而后定义了一个解决分数并格式化输入的函数func。主函数main 中读取用户输出的两个分数,而后别离计算它们的和、差、积、商,并输入后果。
程序应用 scanf 函数从规范输出读取两个分数,格局为 %lld/%lld %lld/%lld,别离对应四个长整型变量a, b, c, d。这里的%lld 是读取长整型的格局指定符。
func函数是程序的外围,它承受两个长整型参数 mn,别离代表分数的分子和分母。函数首先查看分子或分母是否为 0,如果是,则依据状况输入 Inf(无穷大)或0。接着,函数解决分数的正负号,并计算分数的整数局部x。而后,函数通过计算最大公约数来简化分数,并依照格局输入分数。
main函数中,程序别离计算了两个分数的和、差、积、商,并调用 func 函数输入后果。加减运算通过通分后相加或相减来实现,乘法通过分子相乘、分母相乘来实现,除法令是通过分子乘以另一个分数的分母、分母乘以另一个分数的分子来实现。
程序的输入格式化得很好,可能解决正负整数和分数,以及它们的运算后果。

正文完
 0