L1-009. N个数求和

xiaoxiao2021-02-28  13

本题的要求很简单,就是求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<algorithm> #include<cstdio> #include<cstring> #include<map> #include<cmath> using namespace std; long long int f(long long int x,long long int y)//辗转相除求得最大公因数 { long long int temp; if(y>x){ temp = y; y = x; x = temp; } while(x%y){ temp = y; y = x%y; x = temp; } return y; } int main() { long long int a, b, c,flag=1; cin>>a; if(a==0){ cout<<'0'<<endl; return 0; } long long int a1,b1,a2,b2; char ur; cin>>a1>>ur>>b1; long long int temp; temp = f(abs(a1),b1); //temp = abs(temp); a1/=temp; b1/=temp; for(int i=0;i<a-1;i++){//经过简单的运算可以得到相加之后的结果,然后合并,继续下一步运算 cin>>a2>>ur>>b2; long long int suma,sumb; temp = f(abs(a2),b2); //temp = abs(temp); a2/=temp; b2/=temp; long long int zxg = b1*b2/f(b1,b2); suma = a1*zxg/b1+a2*zxg/b2; sumb = zxg; if(suma==0){//如果这里分子为0,则不能进入gcd运算,会出现浮点错误 a1=0; b1=sumb; continue; } temp = f(abs(suma),sumb); suma/=temp; sumb/=temp; a1 = suma; b1 = sumb; } if(a1==0){ cout<<'0'<<endl; } else if(b1==1){ cout<<a1*flag<<endl; } else if(a1<b1){ cout<<flag*a1<<"/"<<b1<<endl; } else if(a1>b1){ cout<<a1/b1<<' '<<a1
转载请注明原文地址: https://www.6miu.com/read-1900079.html

最新回复(0)