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 }

 

posted @ 2015-02-17 19:25  Memoryヾノ战心  阅读(798)  评论(0编辑  收藏  举报