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
题意:
输入n个分数,输出这些分数的和.
思路:
(1)因为分子分母加运算涉及乘操作,所以设定分子分母数据类型为long long;
(2)设计分数加运算函数add()和分数化简函数reduction(),每次分数进行了加运算后要化简,否则测试点会超时,最后设计函数show()输出分数,具体实现见代码.
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
struct Fraction{
//分子、分母
LL up,down;
};
Fraction add(Fraction a,Fraction b){
//分数加运算
Fraction c;
c.up = a.up*b.down+a.down*b.up;
c.down = a.down*b.down;
return c;
}
LL gcd(LL a,LL b){
//递归求公约数
return !b ? a:gcd(b,a%b);
}
Fraction reduction(Fraction a){
//分数化简
if(a.down<0){
//如果分母小于0则分子分母取相反数
a.up = -a.up;
a.down = -a.down;
}
if(a.up==0) a.down = 1;//如果分子为0则令分母为1
else{
//如果分子不为0则化简分数
int b = gcd(abs(a.up),abs(a.down));//取分子分母绝对值求最大公约数
a.up = a.up/b;
a.down = a.down/b;
}
return a;
}
void show(Fraction a){
//输出分数
if(a.down==1) printf("%lld\n",a.up);//如果分母为1则分子部分作为整数输出
else if(a.up>a.down) printf("%lld %lld/%lld\n",a.up/a.down,abs(a.up)%a.down,a.down);//如果分数为假分数则按带分数形式输出
else printf("%lld/%lld\n",a.up,a.down);//如果分数为真分数则直接输出
}
int main(){
int n;
scanf("%d",&n);
Fraction A[n],result;
result.up = 0,result.down = 1;//分子初始化为0,分母初始化为1
for(int i=0;i<n;i++){
scanf("%lld/%lld",&A[i].up,&A[i].down);
result = add(result,A[i]);
result = reduction(result);//每一次加法运算完都要化简,否则超时
}
show(result);
return 0;
}
词汇:
rational number 有理数
numerator 分子
denominator 分母
文章评论