#include <cstdio>
#include <cstdlib>
using namespace std;
typedef long long LL;
struct Fraction{
LL up;
LL down;
};
int i = 1;
LL gcd(LL a, LL b){
if(b == 0) return a;
return gcd(b, a%b);
}
Fraction reduction(Fraction f){
if(f.down < 0){
f.down = -f.down;
f.up = -f.up;
}
if(f.up == 0){
f.down = 1;
}else{
int d = gcd(abs(f.up),f.down);
f.up /= d;
f.down /= d;
}
return f;
}
void show(Fraction f){
f = reduction(f);
if(f.up < 0) printf("(");
if(f.down == 1){
printf("%lld", f.up);
}else if(abs(f.up) > f.down){
printf("%lld %lld/%lld", f.up/f.down, abs(f.up)%f.down, f.down);
}else{
printf("%lld/%lld", f.up, f.down);
}
if(f.up < 0) printf(")");
}
Fraction jia(Fraction f1, Fraction f2){
Fraction res;
res.up = f1.up*f2.down + f1.down*f2.up;
res.down = f1.down*f2.down;
return reduction(res);
}
Fraction jian(Fraction f1, Fraction f2){
Fraction res;
res.up = f1.up*f2.down - f1.down*f2.up;
res.down = f1.down*f2.down;
return reduction(res);
}
Fraction cheng(Fraction f1, Fraction f2){
Fraction res;
res.up = f1.up*f2.up;
res.down = f1.down*f2.down;
return reduction(res);
}
Fraction chu(Fraction f1, Fraction f2){
Fraction res;
res.up = f1.up*f2.down;
res.down = f1.down*f2.up;
return reduction(res);
}
int main(){
Fraction f1, f2;
scanf("%lld/%lld %lld/%lld", &f1.up, &f1.down, &f2.up, &f2.down);
show(f1);
printf(" + ");
show(f2);
printf(" = ");
show(jia(f1,f2));
printf("\n");
show(f1);
printf(" - ");
show(f2);
printf(" = ");
show(jian(f1,f2));
printf("\n");
show(f1);
printf(" * ");
show(f2);
printf(" = ");
show(cheng(f1,f2));
printf("\n");
show(f1);
printf(" / ");
show(f2);
printf(" = ");
if(f2.up == 0) printf("Inf");
else(show(chu(f1,f2)));
printf("\n");
return 0;
}
この質問は本当です。非常に単純な質問ですが、テストポイント2と3は合格していません。
他の人の分析を読んだ後、私は長い間使用し、0で判断しました。サンプルは問題ありませんが、テストポイント2と3はまだ生き残るのが難しいです。最後に、名前空間を追加した後、それが合格したことを誤って発見しましたか???理由がわかりません。