题目链接:https://www.nowcoder.com/pat/1/problem/4311
题意:
给N个分数,求出之和。输出结果用假分数表示。
分析:
需要约分,需要求最小公约数,简单的数学题
就是输出比较坑,要注意格式
1.分数部分保证输出负号在分子之前
2.如果分子为零,分数部分就不输出
3.如果整数部分为零,且分数部分不为零,则整数部分不输出
样例
输入例子:
5
2/5 4/15 1/30 -2/60 8/3
输出例子:
3 1/3
代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int n;
int num[105][2];
void split(int i,string str)
{
stringstream ss;
char ch;
ss << str;
ss >> num[i][0] >> ch >> num[i][1];
// cout << num[i][0] << num[i][1];
}
int gcd(int a,int b)
{
if(a%b==0)
{
return b;
}
return gcd(b,a%b);
}
void add(int a[],int b[])
{
// cout << " into add!!!" << endl;
int yue,bei;
if(a[1]==0||a[0]==0)
{
a[0]=b[0];
a[1]=b[1];
yue = gcd(a[0],a[1]);
a[0]/=yue;a[1]/=yue;
return ;
}
if(b[1]==0||b[0]==0)
{
return;
}
yue = gcd(a[1],b[1]);
bei = a[1]/yue*b[1];
a[0] = (b[1]/yue)*a[0] + (a[1]/yue)*b[0];
a[1] = bei;
yue = gcd(a[0],a[1]);
a[0]/=yue;a[1]/=yue;
//cout << a[0] << a[1] << endl;
}
int main()
{
cin >> n;
string str;
for(int i=0;i<n;i++)
{
cin >> str;
split(i,str);
}
int sum[2];
sum[0]=0,sum[1]=0;
for(int i=0;i<n;i++)
{
add(sum,num[i]);
if(sum[1]<0)
{
sum[0] = 0 - sum[0];
sum[1] = 0 - sum[1];
}
// cout << sum[0] << sum[1] << endl;
}
int x,y,z;
x = sum[0]/sum[1];
y = (sum[0] - sum[0]/sum[1]*sum[1]);
z = sum[1];
if(y==0)
{
cout << x << endl;
}
else if(x==0)
{
cout << y << "/" << z << endl;
}
else {
cout << x << " " << y << "/" << z << endl;
}
return 0;
}