[code] PTA 胡凡算法笔记 DAY044

题目 A1088 Rational Arithmetic

在这里插入图片描述

  • 题意
    输入两个分数,输出进行加减乘除的结果,需要输出最简的方式(带分数或整数或真分数)。除法分母为0时,输出Inf

  • 思路
    数据用结构体的方式存储,主要是对数据的化简和输出真分数函数的书写。然后这里还需要注意一下除法分母为0时需要单独处理。然后设计四则运算函数的时候要考虑清楚哪些是函数外控制的哪些是函数内控制的。

  • Code in C++

#include <cstdio>
#include <algorithm>

struct fraction
{
    long long up;
    long long down;
    void print()
    {
        printf("%lld / %lld\n", up, down);
    }
}a, b;

// 最大公约数
long long gcd(long long a, long long b);
// 化简
fraction reduction(fraction f);
fraction add(fraction a, fraction b);
fraction sub(fraction a, fraction b);
fraction mul(fraction a, fraction b);
fraction divide(fraction a, fraction b);
void print(fraction a);

int main()
{
    scanf("%lld/%lld %lld/%lld", &a.up, &a.down, &b.up, &b.down);
    // 加
    print(a);
    printf(" + ");
    print(b);
    printf(" = ");
    print(add(a, b));
    printf("\n");
    // 减
    print(a);
    printf(" - ");
    print(b);
    printf(" = ");
    print(sub(a, b));
    printf("\n");

    // 乘
    print(a);
    printf(" * ");
    print(b);
    printf(" = ");
    print(mul(a, b));
    printf("\n");

    // 除
    print(a);
    printf(" / ");
    print(b);
    printf(" = ");
    if (b.up == 0) printf("Inf");
    else print(divide(a, b));

    return 0;
}

long long gcd(long long a, long long b)
{
    if (b == 0) return a;
    else return gcd(b, a % b);
}

fraction reduction(fraction f)
{
    if (f.down < 0)
    {
        f.up = -f.up;
        f.down = -f.down;
    }
    if (f.up == 0) f.down = 1;
    else
    {
        long long gcd_num = gcd(std::abs(f.up), std::abs(f.down));
        f.up = f.up / gcd_num;
        f.down = f.down / gcd_num;
    }

    return f;
}

fraction add(fraction a, fraction b)
{
    fraction result;
    result.up = a.up * b.down + b.up * a.down;
    result.down = a.down * b.down;
    return reduction(result);
}

fraction sub(fraction a, fraction b)
{
    fraction result;
    result.up = a.up * b.down - b.up * a.down;
    result.down = a.down * b.down;
    return reduction(result);
}

fraction mul(fraction a, fraction b)
{
    fraction result;
    result.up = a.up * b.up;
    result.down = a.down * b.down;
    return reduction(result);
}

fraction divide(fraction a, fraction b)
{
    fraction result;
    result.up = a.up * b.down;
    result.down = a.down * b.up;
    return reduction(result);
}

void print(fraction a)
{
    a = reduction(a);
    if (a.up < 0) printf("(");
    // 整数
    if (a.down == 1) printf("%lld", a.up);
    // 假分数
    else if (std::abs(a.up) > a.down) printf("%lld %lld/%lld", a.up / a.down, std::abs(a.up) % a.down, a.down);
    // 真分数
    else printf("%lld/%lld", a.up, a.down);
    if (a.up < 0) printf(")");
}


小结

  • 最大公约数的写法

  • 约分操作

  • 化简操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值