N个数求和(PTA)

7-1 N个数求和 (20 分)

本题的要求很简单,就是求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
思路:
每两个相加,分母通分,分子按比例相加,每次运算完成之后化成最简分数。 仅有整数部分输出整数,整数部分为0只输出分数部分(0特殊,输出0),否则整数、分数分开(分数部分都为正数) 这题自己也整了很久,卡17,后来去找了一下题解跑一下发现都有同样的问题(
-3/2的时候他们的结果都是-1 1/-2,个人觉得这样是过不了的)
真的自闭,在认为自己思路正确的情况下修改为如下代码:

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #define ll long long
 5 using namespace std;
 6 
 7 ll gcd(ll a,ll b)
 8 {
 9     return a%b==0?b:gcd(b,a%b);
10 }
11 
12 void solve(ll &a,ll &b)
13 {
14     ll yue=gcd(a,b);
15     if(yue){
16         a/=yue;
17         b/=yue;
18     }
19 }
20 
21 int main()
22 {
23     int n;
24     ll x,y,fz=0,fm=1;
25     scanf("%d",&n);
26     for(int i=0;i<n;i++){
27         scanf("%lld/%lld",&x,&y);
28         ll yue=gcd(fm,y),bei=fm/yue*y;
29         fz=fz*(bei/fm)+x*(bei/y);
30         fm=bei;
31         solve(fz,fm);
32     }
33     //仅为0时输出整数部分0
34     if(fz==0){
35         printf("0
");
36     }
37     else if(abs(fz)<abs(fm)){
38         if(fz*fm<0) printf("-");
39         printf("%lld/%lld
",abs(fz),abs(fm));
40     }
41     else{
42         printf("%lld",fz/fm);
43         if(fz%fm){
44             printf(" %lld/%lld",abs(fz%fm),abs(fm));
45         }
46         printf("
");
47     }
48     return 0;
49 }
原文地址:https://www.cnblogs.com/ChangeG1824/p/10451191.html