poj 3979 分数加减法

分数加减法
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 13666   Accepted: 4594

Description

编写一个C程序,实现两个分数的加减法

Input

输入包含多行数据 
每行数据是一个字符串,格式是"a/boc/d"。 

其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。 

数据以EOF结束 
输入数据保证合法

Output

对于输入数据的每一行输出两个分数的运算结果。 
注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数

Sample Input

1/8+3/8
1/4-1/2
1/3-1/3

Sample Output

1/2
-1/4
0

分析:先通分再约分,即求出两个分母的最小公倍数,求分子分母的最大公约数来约分,
最终结果可能是0,那么直接输出0;
可能是整数
可能是正数,也可能是负数;
 1 #include <stdio.h>
 2 #include <math.h>
 3 
 4 int gcd(int x, int y){//辗转相除法求最大公约数,x >= y;
 5     if(x < y){
 6         int tmp = x;
 7         x = y;
 8         y = tmp;
 9     }
10     if(y == 0)
11         return x;
12     return gcd(y, x % y);
13 }
14 
15 int main(){
16     int a, b, c, d, _gcd, _lcm, numerator, _a, _c, _gcd1;
17     char o;
18     while(scanf("%d/%d%c%d/%d", &a, &b, &o, &c, &d) != EOF){
19         _gcd = gcd(b, d);
20         _lcm = b / _gcd * d;//两个分母的最小公倍数
21         _a = a * d / _gcd;//通分后第一个分式的分子
22         _c = c * b / _gcd;//通分后第二个分式的分子
23                 //计算和式的分子值
24         if(o == '+')
25             numerator = _a + _c;
26         else
27             numerator = _a - _c;
28                 //如果分子值为0,则直接输出
29         if(numerator == 0)
30             printf("%d\n", numerator);
31         else{
32             _gcd1 = gcd(abs(numerator), _lcm);
33                         //最大公约数和分母相同,说明分子和分母相同,最后的值为整数
34             if(_gcd1 == _lcm)
35                 printf("%d\n", numerator / _gcd1);
36             else
37                 printf("%d/%d\n", numerator / _gcd1, _lcm / _gcd1);
38         }
39     }
40     return 0;
41 }

 

 
posted @ 2016-08-22 19:47  琴影  阅读(326)  评论(0编辑  收藏  举报