N个数求和(模拟)

 

本题的要求很简单,就是求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
分析:
1.首先把正负号理清.
2.还要把分子为0的情况分出,出现除0的情况.
代码如下:
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int gcd(int x,int y)
 4 {
 5     return y?gcd(y,x%y):x;
 6 }
 7 int main()
 8 {
 9     int n,a1,b1,a2,b2,t,p;
10     scanf("%d",&n);
11     scanf("%d/%d",&a1,&b1);
12     n--;
13     while(n--)
14     {
15         scanf("%d/%d",&a2,&b2);
16         a1=a1*b2+a2*b1;b1*=b2; //进行通分
17         if(a1<0)    //p代表正负
18             a1*=-1,p=-1;
19         else if(a1==0) //分子为0的情况
20         {
21             b1=1;continue;
22         }
23         else p=1;
24         t=gcd(a1,b1);
25         a1=a1*p/t;b1/=t;
26     }
27     if(abs(a1)%b1==0) printf("%d
",a1/b1);  //分类讨论输出
28     else if(abs(a1)/b1>=1) printf("%d %d/%d
",a1/b1,abs(a1)-abs(a1/b1)*b1,b1);
29     else printf("%d/%d
",a1,b1);
30 }
原文地址:https://www.cnblogs.com/zdragon1104/p/8383699.html