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