本题要求编写程序,计算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 = 01 2/3 / 0 = Inf
#include<iostream> #include<string> #include<cmath> using namespace std; long long isp(long long a, long long b); void print(long long a, long long b); void my_plus(long long a1, long long b1, long long a2, long long b2); void my_sub(long long a1, long long b1, long long a2, long long b2); void my_mul(long long a1, long long b1, long long a2, long long b2); void my_div(long long a1, long long b1, long long a2, long long b2); int main() { string s1, s2; cin >> s1 >> s2; long long a1=0, b1=0, a2=0, b2=0; long long sig=1; if (s1[0] == '-') { sig = -1; s1 = s1.substr(1); } int t = s1.find('/'); for (int i = 0; i < t; i++) a1 = 10 * a1 + s1[i] - '0'; a1 = sig*a1; s1 = s1.substr(t + 1); for (int i = 0; i < s1.size(); i++) b1 = 10 * b1 + s1[i] - '0'; sig = 1; if (s2[0] == '-') { sig = -1; s2 = s2.substr(1); } t = s2.find('/'); for (int i = 0; i < t; i++) a2 = 10 * a2 + s2[i] - '0'; a2 = sig*a2; s2 = s2.substr(t + 1); for (int i = 0; i < s2.size(); i++) b2 = 10 * b2 + s2[i] - '0'; //以上将分子分母提取出来(没有问题) my_plus(a1, b1, a2, b2); my_sub(a1, b1, a2, b2); my_mul(a1, b1, a2, b2); my_div(a1, b1, a2, b2); //结束 return 0; } void my_plus(long long a1, long long b1, long long a2, long long b2) { print(a1, b1); cout << " + "; print(a2, b2); cout << " = "; long long m, n; m = a1*b2 + a2*b1; n = b1*b2; print(m, n); cout << endl; } void my_sub(long long a1, long long b1, long long a2, long long b2) { print(a1, b1); cout << " - "; print(a2, b2); cout << " = "; long long m, n; m = a1*b2 - a2*b1; n = b1*b2; print(m, n); cout << endl; } void my_mul(long long a1, long long b1, long long a2, long long b2) { print(a1, b1); cout << " * "; print(a2, b2); cout << " = "; long long m, n; m = a1*a2; n = b1*b2; print(m, n); cout << endl; } void my_div(long long a1, long long b1, long long a2, long long b2) { print(a1, b1); cout << " / "; print(a2, b2); cout << " = "; long long m, n; m = a1*b2; n = b1*a2; if (n == 0) cout << "Inf"; else { if (m/n > 0)//m*n太大了!!! print(abs(m), abs(n)); else print(-abs(m), abs(n)); } cout << endl; } void print(long long a, long long b) { long long t = isp(abs(a), abs(b)); a = a / t; b = b / t; if (a < 0) { cout << "(-"; if ((-a) >= b)//可化简 { cout << (-a) / b; if ((-a) % b != 0) cout << " " << (-a) % b << "/" << b; } else cout << (-a) << "/" << b; cout << ")"; } else if (a == 0) cout << "0"; else//大于0 { if (a >= b)//可化简 { cout << a / b; if (a % b != 0) cout << " " << a % b << "/" << b; } else cout << a << "/" << b; } } long long isp(long long a, long long b) { if (a == 0 || b == 0) return 1; long long temp; long long r = 1; if (a<b) //保证除数为最大数 { temp = a; a = b; b = temp; } while (r != 0) { r = a % b; a = b; b = r; } return a; }