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;
}
然後這個題有以下幾點需要注意:
- s1 存分子之和,s2更新最小公倍數,通分求解分子的和 s1 += s2 / deno[i] * num[i];
- 輸出時注意負數情況
- 如果有餘數 要化簡分子/ 分母,化簡就是分子分母同時除以分子和分母的最大公約數。
#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;
}