/*====================================================== 1006:分数求和 总时间限制: 1000ms 内存限制: 65536kB 描述 输入n个分数并对他们求和,用约分之后的最简形式表示。 比如: q/p = x1/y1 + x2/y2 +....+ xn/yn, q/p要求是归约之后的形式。 如:5/6已经是最简形式,3/6需要规约为1/2, 3/1需要规约成3,10/3就是最简形式。 PS:分子和分母都没有为0的情况,也没有出现负数的情况 输入 第一行的输入n,代表一共有几个分数需要求和 接下来的n行是分数 输出 输出只有一行,即归约后的结果 样例输入 2 1/2 1/3 样例输出 5/6 解析:这个题呢,主要是要注意最后输出时分母可能是1. 另外,这里保证了输入的分子和分母都没有0和负数,所以处理简单化了。 ========================================================*/ #include<stdio.h> struct fraction { int a,b;//分数a/b的分子和分母 }; int Gcd(int a,int b);//返回a和b的最大公约数 int Lcm(int a,int b);//返回a和b的最小公倍数 int main() { int n,i,d; struct fraction f1,f2; char c; //freopen("3.in","r",stdin); scanf("%d",&n); scanf("%d%c%d",&f2.a,&c,&f2.b); d=Gcd(f2.a,f2.b); if(d>1) { f2.a=f2.a/d; f2.b=f2.b/d; } for(i=2;i<=n;i++) { scanf("%d%c%d",&f1.a,&c,&f1.b); d=Lcm(f2.b,f1.b); f2.a=f2.a*d/f2.b+f1.a*d/f1.b; f2.b=d; d=Gcd(f2.a,f2.b); if(d>1) { f2.a=f2.a/d; f2.b=f2.b/d; } } if(f2.b>1) printf("%d/%d ",f2.a,f2.b); else printf("%d ",f2.a); return 0; } int Gcd(int a,int b) { int c; if(a<=0||b<=0) return -1; if(a<b) { c=a; a=b; b=c; } c=a%b; while(c!=0) { a=b; b=c; c=a%b; } return b; } int Lcm(int a,int b) { int c; if(a<=0||b<=0) return -1; c=Gcd(a,b); return a*b/c; }