-
最大公因数。求公因数用辗转相除法,但是当时忘记部分怎么写了,所以稍微推了推写出了下面这个东西。
ll gcd(ll a, ll b){ return a % b ? gcd(b, a % b) : b; }
但写完之后发现跟辗转相除法的形式不太一样,真正的应该是这样的表示。
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
自己都感觉很神奇,为什么这样乱凑也能够凑出一个正确的结果。不过还是记一下正确的写法比较好,免得乱推下次推错了。
-
分数运算。最开始写错,将求和保存的分子分母初始化为 0 所以最后结果一直都是 0 。后面才想起来应该初始化为 1 。
不过后面就没有初始化了,改成提前读取一个分数。
-
输出情况当时列了下,整数两种分数两种,所以有四种可能,故当时代码这样写。
// 存在则输出整数 if(sumUp / sumDown != 0){ cout << sumUp / sumDown; // 分子不为0 if(sumUp % sumDown != 0) cout << " " << sumUp % sumDown << "/" << sumDown; } // 不存在整数 else{ if(sumUp % sumDown != 0) cout << sumUp % sumDown << "/" << sumDown; else cout << 0; }
而参考了别人的代码发现,可以将代码简化为三个判断。
if (fz && fz / fm == 0) cout << fz << "/" << fm; else if (fz % fm == 0) cout << fz / fm; else cout << fz / fm << " " << fz % fm << "/" << fm;
分别是整数为 0 分子不为 0 ;整数不为 0 分子为 0 ;整数不为 0 分子不为 0 三种情况输出。
这就比我们当时写的少了一种,整数为 0 分子为 0 的情况。将这个情况归入了,整数不为 0 分子为 0 的情况。
因为这两个都是 0 时,只需要输出一个数字 0 。而同理 整数不为 0 分子为 0 时不需要输出分数仅剩整数,所以可以将 0 归入这个情况内考虑。
当然,不整合并的话,直接按照四种情况考虑输出就好了。如果想不到的话,也不一定要合并化简代码,结果上是一致的。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
int main(){
ll N, sumUp, sumDown;
char c;
// 提前读取一个分数
cin >> N >> sumUp >> c >> sumDown;
N--;
while(N--){
ll tmpUp, tmpDown;
cin >> tmpUp >> c >> tmpDown;
// 通分 交叉相乘后累加
sumUp = sumUp * tmpDown + tmpUp * sumDown;
sumDown *= tmpDown;
// 约分
ll tmp = gcd(sumUp, sumDown);
sumUp /= tmp, sumDown /= tmp;
}
// 存在则输出整数
if(sumUp / sumDown != 0){
cout << sumUp / sumDown;
// 分子不为0
if(sumUp % sumDown != 0) cout << " " << sumUp % sumDown << "/" << sumDown;
}
// 不存在整数
else{
if(sumUp % sumDown != 0) cout << sumUp % sumDown << "/" << sumDown;
else cout << 0;
}
}