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结束
输入数据保证合法
每行数据是一个字符串,格式是"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 }
越努力,越幸运