【演算法學習】數學專題 有理數類别範本
過載了 +, -, *, /, <<
操作的有理數類别範本:
#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++】 59_類别範本深度剖析C++
- C++ 單例類别範本(詳解)C++單例
- c++函式模板和類别範本C++函式
- 專題:數學
- C++知識點57——類别範本(2、類别範本的區域性特化與預設模板實參)C++
- 隱藏在 SDK 中的單例類别範本單例
- 【C++】 61_智慧指標類别範本C++指標
- 自定義 Xcode ViewController 類别範本XCodeViewController
- c++佇列類别範本的實現C++佇列
- C++有理數類設計C++
- 數學類筆試題筆試
- c++類别範本成員函式報錯C++函式
- 【演算法學習】組合數學演算法
- c++11-17 模板核心知識(二)—— 類别範本C++
- c++中模板_類别範本的宣告和定義C++
- 數學建模習題3.3
- 數學建模習題6.4
- 數學建模習題3.2
- 如何閱讀一本書(如何學習數學)
- 演算法學習之路|朋友數演算法
- 演算法學習之路|數零壹演算法
- C++ Templates (2.2 使用Stack類别範本 Use of Class Template Stack )C++
- 演算法學習之路|科學計數法演算法
- 數學科學電子課本
- C++之函式模板與類别範本的區別(三)C++函式
- 演算法學習筆記(40): 具體數學演算法筆記
- 數學處理類
- C++ Templates (2.1 類别範本Stack的實現 Implementation of Class Template Stack)C++