本题的要求很简单,就是求N
个数字的和。麻烦的是,这些数字是以有理数分子/分母
的形式给出的,你输出的和也必须是有理数的形式。
输入格式:
输入第一行给出一个正整数N
(≤100)。随后一行按格式a1/b1 a2/b2 ...
给出N
个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分
,其中分数部分写成分子/分母
,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1:
5
2/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
2
4/3 2/3
输出样例2:
2
输入样例3:
3
1/3 -1/6 1/8
输出样例3:
7/24
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
long int gy(long int m,long int n){
//求最大公约数
int a,b;
if(m<n){
b=m;a=n;
}else{
a=m;b=n;
}
long int temp=b;
while(temp){
temp=a%b;
a=b;
b=temp;
}
return a;
}
int main(){
char in[10],ch; //ch表示'/'
int N,i,cou=0; //共N个分数相加
long long fa=0,fb=1;
long long m,n,T,a,b;
//m,n分别代表每个分数的分子和分母
//T代表a和b的最大公约数
cin>>N;
for(i=0;i<N;i++){
cin>>m>>ch>>n;
if(m==0){
//如果分子为0,代表这个分数值为0,不执行任何操作
continue;
}
if(fabs(m)>=n){
//分子大于分母时,把整数部分提出来
cou+=(m/n);
m=m-(m/n)*n;
}
a=fabs(m);b=fabs(n);
T=gy(a,b);
if(T<=min(a,b)){
//将分子分母最简化
n/=T;
m/=T;
}
//算出当前的和,
fa=(fa*n+fb*m);
fb=fb*n;
a=fabs(fa);b=fabs(fb);
if(a>=b){
cou+=(fa/fb);
fa-=(fa/fb)*fb;
}
T=gy(a,b);
a=fabs(fa);
if(T<=min(a,b)){
fa/=T;
fb/=T;
}
}
if(cou==0&&fa==0){
cout<<cou;
}
if(cou!=0){
cout<<cou;
}
if(fa!=fb&&fa!=0){
T=gy(fa,fb);
if(T<=min(fa,fb)){
fa/=T;
fb/=T;
}
if(cou!=0){
cout<<" ";
}
cout<<fa<<"/"<<fb;
}
return 0;
}