nyoj 111-分数加减法 (gcd, switch, 模拟,数学)

111-分数加减法


内存限制:64MB 时间限制:1000ms 特判: No
通过数:20 提交数:54 难度:2

题目描述:

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

输入描述:

输入包含多行数据 
每行数据是一个字符串,格式是"a/boc/d"。 
其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。 

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

输出描述:

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

样例输入:

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

样例输出:

1/2
-1/4
0

C/C++ AC:

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <stack>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <climits>
11 
12 using namespace std;
13 
14 int gcd(int a, int b)
15 {
16     if (a < 0) a = -a;
17     if (b < 0) b = -b;
18     if (b == 0) return a;
19     return gcd(b, a%b);
20 }
21 
22 int main()
23 {
24     int a, b, c, d, e, f;
25     char ch;
26     while (~scanf("%d/%d%c%d/%d", &a, &b, &ch, &c, &d))
27     {
28         if (b == d)
29         {
30             f = b;
31             switch (ch)
32             {
33             case '+':
34                 e = a + c; break;
35             default:
36                 e = a - c;
37             }
38             int temp = gcd(e, f);
39             e /= temp, f /= temp;
40             if (e == 0)  // 特殊判断1,分子为0
41                 printf("0\n");
42             else if (f == 1)  // 特殊判断2,分母为1
43                 printf("%d\n", e);
44             else
45                 printf("%d/%d\n", e, f);
46         }
47         else
48         {
49             f = b * d;
50             switch (ch)
51             {
52             case '+':
53                 e = a * d + c * b; break;
54             default:
55                 e = a * d - c * b;
56             }
57             int temp = gcd(e, f);
58             e /= temp, f /= temp;
59             if (e == 0)
60                 printf("0\n");
61             else if (f == 1)
62                 printf("%d\n", e);
63             else
64                 printf("%d/%d\n", e, f);
65         }
66     }
67 }

猜你喜欢

转载自www.cnblogs.com/GetcharZp/p/9328646.html