代码
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
struct fenshu {
long long int fenzi;
long long int fenmu;
};
//辗转相除求最大公约数
long long int maxFactor(long long int a, long long int b) {
if(a==0 || b==0){
return 1;
}
if(a<b){
long long int tmp = a;
a = b;
b = tmp;
}
while(a%b){
long long int reminder = a%b;
a = b;
b = reminder;
}
return b;
}
//分数简化
void simplify(fenshu &f) {
long long int maxF = maxFactor(abs(f.fenzi), abs(f.fenmu));
if(maxF>0) {
f.fenzi /= maxF;
f.fenmu /= maxF;
}
if(f.fenzi*f.fenmu<0) {
f.fenzi = -1 * abs(f.fenzi);
f.fenmu = abs(f.fenmu);
} else {
f.fenzi = abs(f.fenzi);
f.fenmu = abs(f.fenmu);
}
}
//四则运算
fenshu ope(fenshu f1, fenshu f2, char ch) {
fenshu re;
switch(ch) {
case '+':
re.fenmu = f1.fenmu * f2.fenmu;
re.fenzi = f1.fenzi * (re.fenmu/f1.fenmu) + f2.fenzi * (re.fenmu/f2.fenmu);
break;
case '-':
re.fenmu = f1.fenmu * f2.fenmu;
re.fenzi = f1.fenzi * (re.fenmu/f1.fenmu) - f2.fenzi * (re.fenmu/f2.fenmu);
break;
case '*':
re.fenmu = f1.fenmu * f2.fenmu;
re.fenzi = f1.fenzi * f2.fenzi;
break;
case '/':
re.fenmu = f1.fenmu * f2.fenzi;
re.fenzi = f1.fenzi * f2.fenmu;
break;
}
simplify(re);
return re;
}
//输出一个分数
void outputNum(fenshu f) {
if(f.fenmu==0) {
printf("Inf");
return;
}
long long int tmpFenzi = f.fenzi;
long long int zheng = 0;
long long int xiaoshu = 0;
if(abs(f.fenzi)/f.fenmu>0) {
zheng = abs(f.fenzi)/f.fenmu;
}
if(abs(f.fenzi)%f.fenmu>0) {
f.fenzi = abs(f.fenzi)%f.fenmu;
xiaoshu = 1;
}
if(tmpFenzi!=0) {
if(tmpFenzi<0){
printf("(-");
}
if(zheng) {
printf("%lld", zheng);
}
if(xiaoshu) {
if(zheng) {
printf(" %lld/%lld", f.fenzi, f.fenmu);
} else {
printf("%lld/%lld", f.fenzi, f.fenmu);
}
}
if(tmpFenzi<0){
printf(")");
}
} else {
printf("0");
}
}
//按题目要求输出结果
void output(fenshu f1, fenshu f2, fenshu ans, char ch) {
outputNum(f1);
printf(" %c ", ch);
outputNum(f2);
printf(" = ");
outputNum(ans);
printf("\n");
}
int main() {
fenshu f1, f2;
scanf("%lld/%lld %lld/%lld", &f1.fenzi, &f1.fenmu, &f2.fenzi, &f2.fenmu);
simplify(f1);
simplify(f2);
string op = "+-*/";
for(int i=0; i<op.length(); i++) {
fenshu ans = ope(f1, f2, op.at(i));
output(f1, f2, ans, op.at(i));
}
return 0;
}
注解
1、c++需要用long long int,否则会有两个案例是答案错误。推测是中间计算过程中有越界!
2、求最大公约数要用辗转相除法,否则暴力求解会有一个案例运行超时!此外注意如果输入有0,求最大公约数直接返回1即可。
3、统一把负号放在分子上。整数和小数的输出形式单独考虑。