1081 Rational Sum
分数 20
Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum.
Input Specification:
Each input file contains one test case. Each case starts with a positive integer N (≤100), followed in the next line N rational numbers a1/b1 a2/b2 ... where all the numerators and denominators are in the range of long int. If there is a negative number, then the sign must appear in front of the numerator.
Output Specification:
For each test case, output the sum in the simplest form integer numerator/denominator where integer is the integer part of the sum, numerator < denominator, and the numerator and the denominator have no common factor. You must output only the fractional part if the integer part is 0.
Sample Input 1:
5
2/5 4/15 1/30 -2/60 8/3
Sample Output 1:
3 1/3
Sample Input 2:
2
4/3 2/3
Sample Output 2:
2
Sample Input 3:
3
1/3 -1/6 1/8
Sample Output 3:
7/24
#include<iostream>
#include<cstdio>
using namespace std;
struct fenshu{
__int64 up;
__int64 down;
};
__int64 gcd(__int64 a,__int64 b){
if(b==0)return a;
else return gcd(b,a%b);
}
fenshu simple(fenshu result){//分数化简
//化简有三种情况
//1.分母有负号,分子乘-1,分母也乘-1
//2.分子为0时,令分母为1
//3.约分
if(result.down<0){
result.up*=-1;
result.down*=-1;
}
if(result.up==0){
result.down=1;
}
else{
int j=gcd(abs(result.up),abs(result.down));
result.up/=j;
result.down/=j;
}
return result;
}
fenshu add(fenshu a,fenshu b){
fenshu result;
result.down=a.down*b.down;
result.up=a.up*b.down+a.down*b.up;
return simple(result);
}
void showresult(fenshu result){
result=simple(result);
//1.假分数输出带分数形式 2.分母为1,直接输出分子 3.真分数直接输出
if(result.down==1){
printf("%I64d",result.up);
}
else if(result.up>result.down){
printf("%I64d %I64d/%I64d",result.up/result.down,abs(result.up)%result.down,result.down);
}
else{
printf("%I64d/%I64d",result.up,result.down);
}
}
int main(){
int n,i;
cin>>n;
fenshu sum,temp;
//令和为0,由于和是分数,所以令分子为0,分母为1
sum.up=0,sum.down=1;
for(i=0;i<n;i++){
scanf("%I64d/%I64d",&temp.up,&temp.down);
sum=add(sum,temp);
}
showresult(sum);
cout<<endl;
}