PAT B1034有理数(20ポイント)の4つの算術演算(テストポイント2と3、および名前空間のエラーに注意してください)

ここに画像の説明を挿入

#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はまだ生き残るのが難しいです。最後に、名前空間を追加した後、それが合格したことを誤って発見しましたか?理由がわかりません。

おすすめ

転載: blog.csdn.net/weixin_45964844/article/details/112466925