这道题能够说是我目前刷到的 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
函数输入后果。加减运算通过通分后相加或相减来实现,乘法通过分子相乘、分母相乘来实现,除法令是通过分子乘以另一个分数的分母、分母乘以另一个分数的分子来实现。
程序的输入格式化得很好,可能解决正负整数和分数,以及它们的运算后果。