自己寫的c 大整數計算BigInt類

2021-07-13 05:53:01 字數 3024 閱讀 9703

演算法使用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...