题目是要输出几个分数的和,输出结果要求是输出真分数或带分数。
解题思路:计算过程中会用到求最大公约数(分子分母约分)和最小公倍数(求通分后的分母)的算法,而且考虑到本题数据比较大,故用long long来实现。
#include <stdio.h>
#include <map>
using namespace std;
long long gcd(long long a, long long b)
{
if(b == 0) return a;
return gcd(b, a%b);
}
long long lcm(long long a, long long b)
{
return a*b / gcd(a, b);
}
map<long, long> dict;
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
dict.clear();
long a, b; //以分母为key,分子为value
long long de = 1; //最小公倍数, 分母
for(int i = 0; i < n; i++)
{
scanf("%ld/%ld", &a, &b);
if(dict.count(b) == 1)
dict[b] = dict[b] + a;
else
{
dict[b] = a;
de = lcm(b, de);
}
}
long long nu = 0; //分子
for(map<long, long>::iterator it = dict.begin(); it != dict.end(); it++)
nu += it->second*(de/it->first);
long long gc = gcd(de, nu);
de /= gc, nu /= gc; //约分
if(de == 1)
printf("%lld\n", nu);
else
{
int x = 0;
while(nu > de)
{
nu -= de;
x++;
}
if(x)
printf("%d ", x);
printf("%lld/%lld\n", nu, de);
}
}
return 0;
}