[code] PTA 胡凡算法笔记 DAY043
Posted wait_for_that_day5
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[code] PTA 胡凡算法笔记 DAY043相关的知识,希望对你有一定的参考价值。
文章目录
题目 A1081 Rational Sum
-
题意
输入n
个分数,计算它们的和,输出化简后的形式,即带分数或整数或真分数。 -
思路
数据的存储方式采用结构体,每次输入的时候就将两个分数进行暴力加和之后化简。化简需要用到求最大公约数,并且需要将分母上的负数移到分子上。然后在最后输出的时候需要注意格式(是否会输出多余的空格)。
注意:
以下示例
2
-1/2 2/4
[output] 02
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的主要内容,如果未能解决你的问题,请参考以下文章