一、思路

构造输出函数,格式化输出分数:
1、分子或分母为零,输出0或Inf且不再进行其他处理
2、若分子分母均非零,将格式统一为分子分母均为正数,符号单独存储输出
3、输出分数:
(1)若有整数部分,输出整数
(2)若有整数部分且有分数部分,输出空格
(3)若有分数部分,输出分数

测试点2答案错误:注意符号判断时使用if(up * down < 0) sign = 1;方式,会在up*down溢出时判断错误。

测试点3答案错误:用2/2 1/2试试

二、代码

#include <cstdio>
#include <algorithm>
using namespace std;
int gcd(long long a, long long b)
{
    return !b ? a : gcd(b, a % b);
}
void output(long long a, long long b)
{
    if( !a || !b )
    {
        printf("%s", !b ? "Inf":"0");
        return;
    }
    int sign = ((a >= 0) != (b >= 0)), div = gcd(abs(a), abs(b));
    a = abs(a / div), b = abs(b / div);
    printf("%s", sign ? "(-":"");
    if( a / b )
        printf("%lld%s", a / b, a % b ? " ":"");
    if( a % b )
        printf("%lld/%lld", a % b, b);
    printf("%s", sign ? ")":"");
}
int main()
{
    long long a1, b1, a2, b2;
    scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);
    output(a1, b1), printf(" + "), output(a2, b2), printf(" = "), output(a1 * b2 + a2 * b1, b1 * b2), printf("\n");
    output(a1, b1), printf(" - "), output(a2, b2), printf(" = "), output(a1 * b2 - a2 * b1, b1 * b2), printf("\n");
    output(a1, b1), printf(" * "), output(a2, b2), printf(" = "), output(a1 * a2,b1 * b2), printf("\n");
    output(a1, b1), printf(" / "), output(a2, b2), printf(" = "), output(a1 * b2, b1 * a2), printf("\n");
}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐