L1-009. N个数求和

题目链接:https://www.patest.cn/contests/gplt/L1-009

思路:读入分数个数N,定义一个结构体,储存分子与分母。读入N个分数,

(1)格式化输入%d\%d;求和,即分母相乘为分母,分子分母交叉相乘求和为新的分子。

(2)求和完后,判断分数为最简式,即求是否有最大公约数

(3)判断分子分母大小,按要求格式输出

注意点:

(1)公约数的求法:辗转相除法,更相减损法等等

 1 #include<stdio.h>
 2 #include<math.h>
 3 struct fengshu{
 4     long long fz;
 5     long long fm;
 6 }; 
 7 struct fengshu sum(struct fengshu fs[],int n)
 8 {
 9     struct fengshu sum;
10     sum.fz=0,sum.fm=1;
11     for(int i=0;i<n;i++)
12     {
13         sum.fz=sum.fz*fs[i].fm +sum.fm*fs[i].fz;
14         sum.fm=sum.fm*fs[i].fm;
15     }
16     return sum;
17 }
18 long long gy(long long a,long long b)        //求最大公约数的递归函数 
19 {
20     return b == 0 ? a : ( gy(b, a%b) );     
21 }
22 int main()
23 {
24     int N;
25     struct fengshu fs[100];
26     scanf("%d",&N);
27     for(int i=0;i<N;i++)
28         scanf("%lld/%lld",&fs[i].fz,&fs[i].fm);  //  a/b格式化输入 
29     struct fengshu s;
30     s=sum(fs,N);
31     long long g=gy(s.fm,s.fz);
32     s.fm/=g,s.fz/=g;
33     if(s.fz==0) printf("%lld",0);
34     else if(abs(s.fz)<s.fm) printf("%lld/%lld\n",s.fz,s.fm);
35     else if(abs(s.fz)>s.fm) printf("%lld %lld/%lld\n",s.fz/s.fm,s.fz%s.fm,s.fm);
36     return 0;
37 }

 

posted @ 2018-01-18 13:04  爱你的笑  阅读(228)  评论(0编辑  收藏  举报