L1-009 N個數求和 (20分)(分數求和)

N個數求和

本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數分子/分母的形式給出的,你輸出的和也必須是有理數的形式。

輸入格式:
輸入第一行給出一個正整數N(≤100)。隨後一行按格式a1/b1 a2/b2 …給出N個有理數。題目保證所有分子和分母都在長整型範圍內。另外,負數的符號一定出現在分子前面。

輸出格式:
輸出上述數字和的最簡形式 —— 即將結果寫成整數部分 分數部分,其中分數部分寫成分子/分母,要求分子小於分母,且它們沒有公因子。如果結果的整數部分爲0,則只輸出分數部分。

輸入樣例1:
5
2/5 4/15 1/30 -2/60 8/3

輸出樣例1:
3 1/3

輸入樣例2:
2
4/3 2/3

輸出樣例2:
2

輸入樣例3:
3
1/3 -1/6 1/8

輸出樣例3:
7/24

此題主要考查遞歸求解最大公約數,然後最小公倍數 = 兩數相乘 / 最大公約數。

簡單舉個例子熟悉一下

#include<iostream>
using namespace std;
long  gcd(long a,long b)
{//求最大公約數 
	return a % b == 0 ? b : gcd(b, a % b);
}
int main()
{
	int a, b;
	cin >> a >> b;
	cout << "最大公約數: " << gcd(a, b) << endl;
	cout << "最小公倍數:" << (a * b) / gcd(a, b) << endl; 
}

在這裏插入圖片描述

然後這個題有以下幾點需要注意:

  1. s1 存分子之和,s2更新最小公倍數,通分求解分子的和 s1 += s2 / deno[i] * num[i];
  2. 輸出時注意負數情況
  3. 如果有餘數 要化簡分子/ 分母,化簡就是分子分母同時除以分子和分母的最大公約數。
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b)
{
	//求兩個數的最大公約數 
	return a % b == 0 ? b : gcd(b, a % b);
}


int main()
{
	int n;
	scanf("%d", &n);
	ll num[105], deno[105]; //分子和分母 
	ll s1 = 0, s2 = 0;///s1表示通分後分子之和,s2表示當前最小公倍數
	  
	for(int i = 0; i < n; i ++ )
	{
		scanf("%lld/%lld", &num[i], &deno[i]);
	}
	s2 = deno[0];//初始最小公倍數
	
	for(int i = 1; i < n; i ++ )//從下一個數的分母開始 
	{//求最小公倍數s2
		s2 = s2 * deno[i] / gcd(s2, deno[i]);//最小公倍數 = 兩數乘積 / 最大公約數 
	} 
	
	for(int i = 0; i < n; i ++ )
	{//求出通分後所有分子之和s1
		s1 += s2 / deno[i] *  num[i];
	} 
	
	ll integer = s1 / s2;//整數 = 分子之和 / 最小公倍數
	ll mode = abs(s1 % s2); //餘數
	if(mode == 0)
	{//沒有餘數 
		cout << integer << endl;
	}
	else
	{//整數不爲0輸出整數,爲0直接輸出分數 
		if(integer != 0) cout << integer << " ";
		if(s1 < 0 ) cout << "-"; 
		//化簡分子分母:分子分母同除以最大公約數 
		cout <<  mode / gcd(s2, mode) << "/" << s2 / gcd(s2, mode); 
	} 
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章