具体思路见代码:
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <ctime>
/// 垮掉!!!!!!!!!!! 考虑 超时 问题 !!可以考虑 先化最简分数 。会减少代码的冗余度。
using namespace std;
// 求最大公约数
//
long long int gcd(long long int t1, long long int t2) {
return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}
//本来自己写了个,然后超时了= =|| gcd
// 把两个 整数 按照 分母 a / b 格式输出 ;
// void printfNum(long long int m,long long int n) {
// long long int t = gcd (m,n); //求出 最大公约数t 先化成最简分数 。
// long long int a=abs(m/t); //然后 化成最简分数 。
// long long int b=abs(n/t); // 取绝对值 方便后面计算;
// if (m==0) {
// cout<<"0";
// }
// if (n==0) {
// cout<<"Inf";
// }
// if (m*n>0 && a>b && a%b!=0) {
// cout<<a/b<<" "<<a-(a/b*b)<<"/"<<b; // 比如 5/3 等于 1 2/3 其中 1=5/3; 2/3 = (5-5/3*3)/3
// }
// if (m*n>0 && a>=b &&a%b==0) {
// cout<<a/b;
// }
// if (m*n>0 && a<b) {
// cout<<a<<"/"<<b;
// }
// if (m*n<0 && a>b && a%b!=0) {
// cout<<"(-"<<a/b<<" "<<a-(a/b*b)<<"/"<<b<<")";
// }
// if (m*n<0 && a>=b && a%b==0) {
// cout<<"(-"<<a/b<<")";
// }
// if (m*n<0 && a<b) {
// cout<<"(-"<<a<<"/"<<b<<")";
// }
// } 一开始 写的方法 无论如何都过不了 测试点2 所以放弃~~重新写 ,不过这里注释一下 方便日后改写。
// 把两个 整数 按照 分母 a / b 格式输出 ;
void printfNum(long long int m, long long int n) {
int flag1 = 0; // 标记m 正负 =0 代表为大于0 =1 代表小于0
int flag2 = 0; // 标记n 正负
if (n == 0) {
cout << "Inf";
return ;
}
if (m == 0) {
cout << 0;
return ;
}
if (m < 0) {
m = 0 - m; // 取反 方便 计算
flag1 = 1;
}
if (n < 0) {
n = 0 - n;
flag2 = 1;
}
int flag = 0; // 标记 m * n 正负 0 代表为正 1代表为负
if (flag1 == 1 && flag2 == 1) {
flag = 0;
} else if (flag1 == 1 || flag2 == 1) {
flag = 1;
}
if (m == n) {
if (flag == 1)
cout << "(-1)";
else
cout << "1";
return;
}
long long int x = m % n; // 判断是否 能整除
long long int y = m / n;
if (x == 0) { // 能整除
if (flag == 0)
cout << y; // 为正 并且 刚好能整除;
else
cout << "(-" << y << ")"; // 为负 。
return ;
} else { // 判断不能整除的情况
long long int t1 = m - y * n; // 这里无需比较m 与n 的大小问题 因为y=m/n 如果m<n y=0;所以无需再判断
long long int t2 = n;
long long int t = gcd(t1, t2); // 最大公约数
t1 = t1 / t; // 化为最简
t2 = t2 / t;
if (flag == 1) {
cout << "(-";
if (y != 0)
cout << y << " " << t1 << "/" << t2;
else
cout << t1 << "/" << t2; // y=0 就是 输入的m<n,应当输出 m/n 的形式
cout << ")";
} else {
if (y != 0)
cout << y << " " << t1 << "/" << t2;
else
cout << t1 << "/" << t2;
}
}
}
void calculate(long long a1,long long b1,long long a2,long long b2,char c) {
printfNum(a1,b1);
cout<<" "<<c<<" ";
printfNum(a2,b2);
cout<<" = ";
}
int main()
{
long long int a1,b1,a2,b2;
scanf("%lld/%lld%lld/%lld",&a1,&b1,&a2,&b2);
// 求加法:
calculate(a1,b1,a2,b2,'+');
long long int sum1=a1*b2+b1*a2;
long long int sum2=b1*b2;
printfNum(sum1,sum2);
cout<<endl;
// 求减法 :
calculate(a1,b1,a2,b2,'-');
long long int sub1=a1*b2-b1*a2; // 2 3 2*4-3*3
long long int sub2=b1*b2; // —— - —— = ——————
printfNum(sub1,sub2); // 3 4 3*4
cout<<endl;
// 求乘法
calculate(a1,b1,a2,b2,'*');
long long int mul1=a1*a2;
long long int mul2=b1*b2;
printfNum(mul1,mul2);
cout<<endl;
// 求除法;
calculate(a1,b1,a2,b2,'/');
long long int div1=a1*b2;
long long int div2=b1*a2;
printfNum(div1,div2);
return 0;
}
这是我的提交图 :