演算法使用vector儲存變數,使用乙個flug來儲存正負。
過載的運算子有 + - * += -= *= 還有string型別轉換運算子,《輸出運算子
建構函式有預設建構函式(0),從string構造(支援開頭有無限個-號,但不支援正號),從bigint構造,從long long構造(從而可以支援大多數c++的基本型別)
基本原理和手工列豎式差不多,簡單測試了幾組資料沒問題。
因為個人經驗有限,對const的設定把握不太好,不過應該可以應對大多數情況。
採用的是萬進製,這樣可以比較方便的計算乘法進製,單位資料使用_uint32_t型別以方便移植(如果系統不支援這個型別,自己定義#define _uint32_t long long,但注意long long可能屬於c++11)
class裡面列舉常量max是進製單位,znum是max中0的數量,因為string轉換的原因只能使用10的整數倍進製,並且要max平方對於_uint32_t不溢位。
乘法採用的也是列豎式的方法,從10進製推廣到了max進製。
其他編譯器出了些問題,測試用的vs,如果提示sprintf找不到請include一下stdio.h。
並未作完全測試,做過簡單的測試,應該可以正常使用。
#include
#include
#include
using
namespace
std;
class bigint;
vector
<_uint32t> datarr;//這裡用小端模式
bool flug;//正負
public:
/** 建構函式:
* 預設建構函式 0
* 從long long來構造乙個bigint
* 從string來構造乙個bigint
* 從bigint來構造乙個bigint
* */
bigint() :datarr(1, 0),flug(true){}
bigint(bigint & bigint) :datarr(bigint.datarr), flug(bigint.flug){}
bigint(long
long num) :datarr(32 / znum), flug(true)
}bigint(const
string & num) :datarr(num.size() / znum + (num.size() % znum == 0 ? 0 : 1), 0), flug(true)
--nsize;
for (; i <= nsize; ++i)//此處不可以用i>0優化
datarr[(nsize - i) / znum] = datarr[(nsize - i) / znum] * 10 + num[i] - '0';
}bigint & operator =(const bigint & that)
size_t getnumsize()const
/** 數**算
* 加乘
* */
/*rely on operator <*/
/*-=提前使用了 += 和 <,若編譯報錯請類外定義*/
bigint & operator -=(const bigint & that)
if (*this
< that)
//*this > that
_uint32t carry = 0;
size_t a = getnumsize(), b = that.getnumsize();
for (size_t i = 0; i < a; ++i)
}return *this;
}bigint & operator +=(const bigint & that)
//符號相同
_uint32t carry = 0;
//擴充套件位數
size_t a = getnumsize(), b = that.getnumsize();
datarr.resize(a = (a > b ? a : b) + 1);
for (int i = 0; i < a; ++i)
return *this;
}bigint operator +(const bigint & that)const
bigint operator -(const bigint & that)const
bigint operator *(const bigint & that)const
}return ret;}/*
* 自乘
* *=運算子用*來實現,沒有優化,會產生乙個中間變數
* */
bigint & operator *=(const bigint & that)
/** 型別轉換
* 到string
* */
operator
string()const
return ret;}/*
* 運算子
* < > == !=
* */
bool
operator
<(const bigint & that)
//copy operator <
//first,chage < to ==
bool
operator ==(const bigint & that)
//copy operator <
//first,change < to !=
bool
operator !=(const bigint & that)
/** 輸出到輸出流
* (執行string轉換)
* */
friend ostream & operator
<<(ostream & out, const bigint & the);
};ostream & operator
<<(ostream & out, const bigint & the)
國王遊戲 大整數用自己寫的vector做的
恰逢 h h國國慶,國王邀請 nn 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 nn 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的所有人...
C 寫自己的的集合
1 除了arraylist,list,net還提供了queue佇列,stack堆疊,hashset雜湊表,dictionary字典,tuple多元組,陣列,collection集合,等多種內建資料結構。基本上總有一種適合你。2 c 允許你用3種方式擴充套件這些類,滿足你的特殊需要 a 從這些類繼承乙...
帶符號大整數計算器 C 實現)
為帶符號大整數定義乙個類。將帶符號大整數表示成兩個值 乙個是絕對值,用無符號大整數表示,乙個是符號,用整形數表示,1表示正號,1表示負號。過載輸入和輸出運算子 和 帶符號大整數以 1234567890,1234567890668這樣的形式來輸入和輸出。注意可能在輸入時包含有正號,所以必須支援像 12...