1034 有理数四则运算 (20 分)
题目链接
算法分析
本题思路是比较简单 的,模拟我们正常计算两个有理数就好了。
关键的难点在于特殊情况的判断:正负,真分数假分数,结果是否为整数和0.
测试点
我卡在了测试点三,运行超时主要是在求最大公约数的地方。解决方法如下:
代码实现
#include<bits/stdc++.h>
using namespace std;
char op[4] = {'+', '-', '*', '/'};
int gcd(long long a, long long b);
void print(long long a, long long b);
int main(){
long long a, b, c, d;
scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
for(int i = 0; i < 4; ++ i){
print(a, b);
printf(" %c ", op[i]);
print(c, d);
printf(" = ");
switch(op[i]){
case '+':
print(a * d + b * c, b * d);
break;
case '-':
print(a * d - b * c, b * d);
break;
case '*':
print(a * c, b * d);
break;
case '/':
print(a * d, b * c);
break;
}
printf("\n");
}
return 0;
}
int gcd(long long a, long long b){
long long c;
if(a < b){
c = a;
a = b;
b = c;
}
while((c = a - b)){
if(a % b == 0) return b; //防超时
a = c > b ? c : b;
b = c > b ? b : c;
}
return a;
}
void print(long long a, long long b){//非常难写的部分
long long c;
if(b == 0){
printf("Inf");
return ;
}
if(a == 0){
printf("0");
return ;
}
if((a > 0 && b > 0 )|| (a < 0 && b < 0)){
a = abs(a);
b = abs(b);
if(a > b){
if(a % b == 0)
printf("%lld", a / b);
else{
printf("%lld ", a / b);
print(a % b, b);
}
}
else if(a == b){
printf("1");
return ;
}
else{
c = gcd(a, b);
printf("%lld/%lld", a / c, b / c);
}
}
else{
a = abs(a);
b = abs(b);
printf("(-");
print(a, b);
printf(")");
}
return ;
}