1. 题目描述
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
2. 分析
化简函数simplify(a,b)
然后一个一个的相加
3 代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
long long gcd1(long long a,long long b)
{
long long factor;
factor = min(abs(a), abs(b));
while(factor>1)
{
if(a%factor==0&&b%factor==0)
{
break;
}
factor--;
}
return factor;
}
long long gcd(long long t1, long long t2) {
return t2==0?t1: gcd(t2,t1%t2);
}
void Simplify(long long a, long long b ) {
if(a*b==0)
{
if(a==0)
{
cout<<0;
} else{
printf("Inf");
}
return;
}
long long k;
bool flag= false;
if(a<0 && b>0) flag= true;//不能用a*b<0判断,会超出范围
if(b<0 && a>0) flag= true;
a = abs(a);
b = abs(b);
k = a/b;
if(flag) printf("(-");
if(k!=0) cout<<k;//输出k
a = a%b;
//化简 a/b
if(a!=0)
{
long long factor = gcd(a,b);
a = a/factor;
b = b/factor;
if(k!=0) printf(" %lld/%lld",a,b);
else printf("%lld/%lld",a,b);
}
if(flag) printf(")");
}
int main() {
int N;
cin>>N;
pair<long long ,long long >data[N];
for(int i=0;i<N;i++)
{
scanf("%lld/%lld",&data[i].first,&data[i].second);
}
long long a=0,b=0,c,d;
a = data[0].first;
b = data[0].second;
for(int i=0;i<N-1;i++)
{
c = data[i+1].first;
d= data[i+1].second;
a = a*d + c*b;
b = b*d;
}
Simplify(a,b);
return 0;
}
3.1 更加简洁的思路
4. 收获
主要还是分数化简函数的编写
pair模板类型的使用,将一对数据进行存储
也可以用vector 来存储 ,不过模板需要是一个结构体