• 最大公因数。求公因数用辗转相除法,但是当时忘记部分怎么写了,所以稍微推了推写出了下面这个东西。

    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;
	} 
}