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 }