1034 有理数四则运算 (20 分)
本题要求编写程序,计算 2 个有理数的和、差、积、商。
输入格式:
输入在一行中按照 a1/b1 a2/b2
的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。
输出格式:
分别在 4 行中按照 有理数1 运算符 有理数2 = 结果
的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b
,其中 k
是整数部分,a/b
是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf
。题目保证正确的输出中没有超过整型范围的整数。
输入样例 1:
2/3 -4/2
输出样例 1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
输入样例 2:
5/3 0/6
输出样例 2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf
思路:
分数的加减乘除涉及到求最大公约数、分数化简和假分数转化成带分数。
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 typedef long long ll; 5 6 ll gcd(ll a, ll b){ 7 if(a%b==0) return b; 8 else gcd(b,a%b); 9 } 10 struct Fraction{ 11 ll up, down; 12 }a, b; 13 Fraction reduction(Fraction f){ 14 if(f.down < 0){ 15 f.up = -f.up; 16 f.down = -f.down; 17 } 18 if(f.up == 0) f.down = 1; 19 else{ 20 int d = gcd(abs(f.up), abs(f.down)); 21 f.up /= d; 22 f.down /= d; 23 } 24 return f; 25 } 26 Fraction add(Fraction f1, Fraction f2){ 27 Fraction result; 28 result.up = f1.up * f2.down + f1.down * f2.up; 29 result.down = f1.down * f2.down; 30 return result; 31 } 32 Fraction minu(Fraction f1, Fraction f2){ 33 Fraction result; 34 result.up = f1.up * f2.down - f1.down * f2.up; 35 result.down = f1.down * f2.down; 36 return result; 37 } 38 Fraction multi(Fraction f1, Fraction f2){ 39 Fraction result; 40 result.up = f1.up * f2.up; 41 result.down = f1.down * f2.down; 42 return result; 43 } 44 Fraction divide(Fraction f1, Fraction f2){ 45 Fraction result; 46 result.up = f1.up * f2.down; 47 result.down = f1.down * f2.up; 48 return result; 49 } 50 void show(Fraction f){ 51 f = reduction(f); 52 if(f.up < 0) printf("("); 53 if(f.down == 1) printf("%lld",f.up); 54 else if(abs(f.up) > abs(f.down)){ 55 printf("%lld %lld/%lld", f.up / f.down, abs(f.up) % f.down, f.down); 56 }else{ 57 printf("%lld/%lld", f.up, f.down); 58 } 59 if(f.up < 0) printf(")"); 60 } 61 void showResult(Fraction f1, Fraction f2, Fraction result, char sign){ 62 show(f1); 63 cout<<" "<<sign<<" "; 64 show(f2); 65 cout<<" = "; 66 if(result.down == 0) cout<<"Inf"; 67 else show(result); 68 cout<<endl; 69 } 70 int main(){ 71 scanf("%lld/%lld %lld/%lld", &a.up, &a.down, &b.up, &b.down); 72 showResult(a, b, add(a, b), '+'); 73 showResult(a, b, minu(a, b), '-'); 74 showResult(a, b, multi(a, b), '*'); 75 showResult(a, b, divide(a, b), '/'); 76 return 0; 77 }