输入一个字符串"a/b o c/d"
其中o为"+ - * /"中的一个
输出运算结果,且为最简分式*`
#include <iostream> #include <string> using namespace std; //求最大公约数 int subMax(int x, int y) { int z = 0; if (x < y) { int t = x; x = y; y = t; } //辗转相除法 while (y != 0) { z = x % y; x = y; y = z; } return x; } int main() { string str; while (getline(cin, str)) { //四种运算符讨论 int fenzi, fenzi2, fenmu, fenmu2, yueshu, yueshu2; switch (str[4]) { case '+': //分母相同,不通分 if (str[2] == str[8]) { int a = (str[0] - '0') + (str[6] - '0'); int b = str[2] - '0'; int c = subMax(a, b); cout << a / c << "/" << b / c << endl; } else { //分母不同,通分 int btemp = str[2] - '0'; int dtemp = str[8] - '0'; int k1 = subMax(btemp, dtemp);//最大公约数 int k2 = btemp * dtemp / k1;//最小公倍数 int atemp = str[0] - '0'; int ctemp = str[6] - '0'; int fenz = k2 / dtemp * atemp + k2 / btemp * ctemp; int yues = subMax(fenz, k2); cout << fenz / yues << "/" << k2 << endl; } break; case '-': //分母相同,不通分 if (str[2] == str[8]) { int a, c; int b = str[2] - '0'; if ((str[0] - '0') < (str[6] - '0')) { a = (str[6] - '0') - (str[0] - '0'); c = subMax(a, b); cout << "-" << a / c << "/" << b / c << endl; } else { a = (str[0] - '0') - (str[6] - '0'); c = subMax(a, b); cout << a / c << "/" << b / c << endl; } } else { //分母不同,通分 int flag = 0; int btemp = str[2] - '0'; int dtemp = str[8] - '0'; int k1 = subMax(btemp, dtemp);//最大公约数 int k2 = btemp * dtemp / k1;//最小公倍数 int atemp = str[0] - '0'; int ctemp = str[6] - '0'; int fenz = k2 / btemp * atemp - k2 / dtemp * ctemp; if (fenz < 0) { fenz = -fenz; flag = 1; } int yues = subMax(fenz, k2); if (flag == 1) { cout << "-" << fenz / yues << "/" << k2 << endl; } else { cout << fenz / yues << "/" << k2 << endl; } } break; case '*': fenzi = (str[0] - '0') * (str[6] - '0'); fenmu = (str[2] - '0') * (str[8] - '0'); yueshu = subMax(fenzi, fenmu); cout << fenzi / yueshu << "/" << fenmu / yueshu << endl; break; case '/': fenzi2 = (str[0] - '0') * (str[8] - '0'); fenmu2 = (str[2] - '0') * (str[6] - '0'); yueshu2 = subMax(fenzi2, fenmu2); cout << fenzi2 / yueshu2 << "/" << fenmu2 / yueshu2 << endl; break; } } return 0; }