Openjudge-计算概论(A)-分数求和
描述:
输入n个分数并对他们求和,并用最简形式表示。所谓最简形式是指:分子分母的最大公约数为1;若最终结果的分母为1,则直接用整数表示。
如:5/6、10/3均是最简形式,而3/6需要化简为1/2, 3/1需要化简为3。
分子和分母均不为0,也不为负数。
输入第一行是一个整数n,表示分数个数,1 <= n <= 10;
接下来n行,每行一个分数,用"p/q"的形式表示,不含空格,p,q均不超过10。输出输出只有一行,即最终结果的最简形式。若为分数,用"p/q"的形式表示。样例输入
2 1/2 1/3
样例输出
5/6
思路:和普通数学算法一样,先通分(传入最小公倍数函数),再加减,最后化简(传入最大公约数函数)
代码如下(本代码来自我的老师:http://www.cnblogs.com/huashanqingzhu/p/3448694.html):
1 #include<stdio.h> 2 struct fraction//分子分母结构体 3 { 4 int a,b; 5 }; 6 int Gcd(int a,int b);//最大公约数 7 int Lcm(int a,int b);//最小公倍数 8 int main() 9 { 10 int n,i,d; 11 struct fraction f1,f2; 12 char c; 13 scanf("%d",&n); 14 scanf("%d%c%d",&f2.a,&c,&f2.b); 15 d=Gcd(f2.a,f2.b); 16 if(d>1) 17 { 18 f2.a=f2.a/d; 19 f2.b=f2.b/d; 20 } 21 for(i=2;i<=n;i++) 22 { 23 scanf("%d%c%d",&f1.a,&c,&f1.b); 24 d=Lcm(f2.b,f1.b); 25 f2.a=f2.a*d/f2.b+f1.a*d/f1.b; 26 f2.b=d; 27 d=Gcd(f2.a,f2.b); 28 if(d>1) 29 { 30 f2.a=f2.a/d; 31 f2.b=f2.b/d; 32 } 33 } 34 if(f2.b>1) 35 printf("%d/%d\n",f2.a,f2.b); 36 else 37 printf("%d\n",f2.a); 38 return 0; 39 } 40 int Gcd(int a,int b) 41 { 42 int c; 43 if(a<=0||b<=0) return -1; 44 if(a<b) 45 { 46 c=a; 47 a=b; 48 b=c; 49 } 50 c=a%b; 51 while(c!=0) 52 { 53 a=b; 54 b=c; 55 c=a%b; 56 } 57 return b; 58 } 59 int Lcm(int a,int b) 60 { 61 int c; 62 if(a<=0||b<=0) return -1; 63 c=Gcd(a,b); 64 return a*b/c; 65 }
我不怕千万人阻挡,只怕自己投降…