[code] PTA 胡凡算法笔记 DAY043

Posted wait_for_that_day5

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[code] PTA 胡凡算法笔记 DAY043相关的知识,希望对你有一定的参考价值。

文章目录

题目 A1081 Rational Sum

  • 题意
    输入n个分数,计算它们的和,输出化简后的形式,即带分数或整数或真分数。

  • 思路
    数据的存储方式采用结构体,每次输入的时候就将两个分数进行暴力加和之后化简。化简需要用到求最大公约数,并且需要将分母上的负数移到分子上。然后在最后输出的时候需要注意格式(是否会输出多余的空格)。
    注意:以下示例

2
-1/2 2/4
[output] 0

2
1/3 -1/2
[output] -1/6

  • Code in C++
#include <cstdio>
#include <algorithm>

typedef long long ll;
struct fraction

    long long up;
    long long down;
sum, tmp;

ll gcd(ll a, ll b); // a,b最大公约数
fraction reduction(fraction result); // 化简
fraction add(fraction a, fraction b);
void showResult(fraction f);

int main()

    int n;
    scanf("%d", &n);
    sum.up = 0, sum.down = 1;
    for (int i = 0; i < n; ++i)
    
        scanf("%lld/%lld", &tmp.up, &tmp.down);
        sum = add(sum, tmp);
    
    showResult(sum);
    return 0;


// a,b最大公约数
ll gcd(ll a, ll b)

    return b == 0 ? a : gcd(b, a % b);


// 化简
fraction reduction(fraction result)

    if (result.down < 0)
    
        result.up = -result.up;
        result.down = -result.down;
    
    if (result.up == 0)
    
        result.down = 1;
    
    else
    
        int d = gcd(std::abs(result.up), abs(result.down));
        result.up /= d;
        result.down /= d;
    
    return result;


// 分数相加
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);


// 展示结果
void showResult(fraction f)

    reduction(f);
    if (f.down == 1) printf("%lld\\n", f.up);
    else if (std::abs(f.up) > f.down) printf("%lld %lld/%lld\\n", f.up/f.down, std::abs(f.up) % f.down, f.down);
    else printf("%lld/%lld\\n", f.up, f.down);



小结

按计算规则对数字进行处理,需要考虑到输入的多种情况,然后全面考虑进行编码。

以上是关于[code] PTA 胡凡算法笔记 DAY043的主要内容,如果未能解决你的问题,请参考以下文章

[code] PTA 胡凡算法笔记 DAY054

[code] PTA 胡凡算法笔记 DAY055

[code] PTA 胡凡算法笔记 DAY055

[code] PTA 胡凡算法笔记 DAY052

[code] PTA 胡凡算法笔记 DAY052

[code] PTA 胡凡算法笔记 DAY048