C/C++實現分數四則運算


這種問題主要是化簡和規範問題,沒有啥技巧性。通過一個結構體數組來表示一個分數:

分數表示

struct Fraction{
	long long up,down;
}

注意事項

需要注意的是下面三個規則:

  • 分子down大於零。若分數爲負數,則令分子和分母都取相反數。

  • 若分數爲0,這令分子up爲0,分母down爲1。

  • 分子和分母都沒有除了1之外的公約數。

代碼實現

寫一遍代碼熟悉一下:

#include<cstdio>
#include<cmath>
typedef long long ll;
struct Fraction{
	ll up,down;
};
//求最大公約數 
ll gcd(ll a, ll b){
	if(b==0)return a;
	else return gcd(b,a%b);
}
//化簡操作
Fraction reduction(Fraction result){
	if(a.down < 0){
		result.up = -result.up;
		result.down = -result.down;
	}
	if(result.up == 0){
		result.down = 1;
	}else{
		ll d = gcd(abs(result.up),abs(result.down));
		result.up /= d;
		result.down /= d;
	}
	return result;
}
 

//加法
Fraction add(Fraction a, Fraction b){
	Fraction result;
	result.up = a.up*b.down + a.down*a.up;
	result.down = a.down * b.down;
	return reduction(result);
}

//減法
Fraction minu(Fraction a, Fraction b){
	Fraction result;
	result.up = a.up*b.down - a.down*b.up;
	result.down = a.down*b.down;
	return reduction(result);
} 

//乘法
Fraction multi(Fraction a , Fraction b){
	Fraction result;
	result.up = a.up*b.up;
	result.down  = a.down*b.down;
	return reduction(result);
}

//除法
Fraction div(Fraction a, Fraction b){
	Fraction result;
	result.up = a.up*b.down;
	result.down = a.down*b.up;
	return reduction(result);
}

//打印
void showResult(Fraction r){
	r = reduction(r);
	if(r.down == 1)printf("%lld",r.up);
	else{
		if(abs(r.up)>abs(r.down)){
			printf("%d %d/%d",r.up/r.down,abs(r.up)%r.down,r.down);
		}else{
			printf("%d/%d",r.up,r.down);
		}
	}
	
} 

注意到除法的時候可能在輸入的時候需要判斷除數是否爲0。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章