这道题能够说是我目前刷到的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
函数是程序的外围,它承受两个长整型参数m
和n
,别离代表分数的分子和分母。函数首先查看分子或分母是否为0,如果是,则依据状况输入Inf
(无穷大)或0
。接着,函数解决分数的正负号,并计算分数的整数局部x
。而后,函数通过计算最大公约数来简化分数,并依照格局输入分数。
在main
函数中,程序别离计算了两个分数的和、差、积、商,并调用func
函数输入后果。加减运算通过通分后相加或相减来实现,乘法通过分子相乘、分母相乘来实现,除法令是通过分子乘以另一个分数的分母、分母乘以另一个分数的分子来实现。
程序的输入格式化得很好,可能解决正负整数和分数,以及它们的运算后果。