【演算法學習】數學專題 有理數類别範本
過載了 +, -, *, /, <<
操作的有理數類别範本:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
class rational {
private:
ll u, d;
ll gcd(ll a, ll b) { return !b ? a : gcd(b, a % b); }
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }
void reduce(ll& u, ll& d) {
ll g = gcd(abs(u), abs(d)); //可能有負數
u /= g, d /= g;
}
public:
rational(ll a, ll b) : u(a), d(b) { reduce(u, d); } //化簡
rational operator+(const rational& t) {
ll m = lcm(d, t.d);
return rational(u * (m / d) + t.u * (m / t.d), m);
}
rational operator-(const rational& t) {
return *this + rational(-t.u, t.d); //用+法實現-法
}
rational operator*(const rational& t) {
return rational(u * t.u, d * t.d);
}
rational operator/(const rational& t) {
if (t.u == 0) return rational(1, 0); //inf,分母為0
if (t.u < 0) return *this * rational(-t.d, -t.u); //分母<0則翻轉分子分母的符號,使得分母為正
return *this * rational(t.d, t.u); //用*法實現/法
}
friend ostream& operator<<(ostream& os, const rational& r);
};
ostream& operator<<(ostream& os, const rational& r) {
if (r.d == 0) { os << "Inf"; return os; } //分母為0,則是除法
//if (r.u == 0) { os << 0; return os; } //分子為0,輸出0
if (r.u < 0) os << "("; //負數需要(
if (r.d == 1) os << r.u; //分母為1,輸出分子; 分子為0,化簡得到分母為1,也一樣輸出分子
else if (abs(r.u) > r.d) os << r.u / r.d << " " << abs(r.u) % r.d << "/" << r.d; //假分數
else os << r.u << "/" << r.d; //真分數
if (r.u < 0) os << ")"; //負數需要)
return os;
}
int main() {
ll a1, b1, a2, b2;
scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);
rational a(a1, b1), b(a2, b2);
cout << a << " + " << b << " = " << (a + b) << endl;
cout << a << " - " << b << " = " << (a - b) << endl;
cout << a << " * " << b << " = " << (a * b) << endl;
cout << a << " / " << b << " = " << (a / b) << endl;
return 0;
}
執行結果1:
執行結果2:
相關文章
- 類别範本
- 陣列類别範本陣列
- C++學習筆記 第59課類别範本深度刨析C++筆記
- 封裝不同類别範本的隨機數生成器封裝隨機
- 類别範本 單例模板單例
- 類别範本與繼承繼承
- 類别範本與友元
- 類别範本的常見用法
- pua 八股類别範本
- 類别範本物件做函式引數物件函式
- C++ 類别範本的寫法C++
- ACM演算法——數學專題ACM演算法
- c++函式模板和類别範本C++函式
- 【C++】 59_類别範本深度剖析C++
- C++ 單例類别範本(詳解)C++單例
- VS2017 設定 類别範本引數推導(CTAD, Class Template Argument Deduction)
- 專題:數學
- C++知識點57——類别範本(2、類别範本的區域性特化與預設模板實參)C++
- 隱藏在 SDK 中的單例類别範本單例
- 【C++】 61_智慧指標類别範本C++指標
- 類别範本與函式模板的區別函式
- C++有理數類設計C++
- 數學專題1
- 類别範本中成員函式建立時機函式
- 【演算法學習】組合數學演算法
- c++11-17 模板核心知識(二)—— 類别範本C++
- 數學建模習題7.3
- 數學建模習題7.7
- 數學建模習題7.10
- 數學建模習題8.4
- 數學建模習題3.2
- 數學建模習題3.3
- 數學建模習題6.4
- C++ Templates (2.2 使用Stack類别範本 Use of Class Template Stack )C++
- 如何閱讀一本書(如何學習數學)
- 中國大學生數學競賽(非數學專業類)競賽大綱
- 構造有理數~
- 演算法學習筆記(40): 具體數學演算法筆記