高精度演算法之大整數類

2022-08-19 06:00:15 字數 3367 閱讀 2525

由於程式語言提供的基本數值資料型別表示的數值範圍有限,不能滿足較大規模的高精度數值計算,因此需要利用其他方法實現高精度數值的計算,於是產生了大數運算。大數運算主要有加、減、乘三種方法。

考慮用陣列儲存整數,並模擬手算的方法進行加減乘除四則運算。為了能像int一樣方便的使用大整數,可以定義結構體,大整數類。

結構體biginteger可用於儲存高精度非負整數。這裡儲存的方案是每8位存在乙個陣列的元素裡,所用base為1億,也就是1e8這麼多,從低位向高位儲存

比如:123456789123456789 儲存為| 23456789 |34567891 |12|在乙個陣列中。

1

struct

biginteger2//

建構函式

8 biginteger operator=(long

long num)//

賦值運算子

9while(num>0

);16

return *this;17

}18 biginteger operator=(const

string& str)//

賦值運算子

1929

return *this;30

}31 }

還可以過載「<>」運算子,使用方便

1 friend ostream& operator

<

}13return

out;14}

15 friend istream& operator>>(istream &in,biginteger&x)

16

由於c++的繼承機制,現在istream類和ostream類都可以使用它來輸出輸入大整數了

上述**中base是靜態成員變數,屬於這個型別而不屬於靜態物件,用static修飾

1  biginteger operator+(const biginteger& b) const211

int x = g;//

g為進製數,滿乙個base才向下進一位

12if(is[i];

13if(ib.s[i];

14 c.s.push_back(x%base);//

進製後本位上的數

15 g = x/base;//

更新進製數16}

17return

c;18

}19 biginteger operator+=(const biginteger&b)

20

一開始就比較兩個數的位數,不相等直接返回,否則從後往前比(低位在前)。注意這是在沒有前導零的情況下才能這樣比,有前導零最後一位還要單獨處理。

bool

operator

for(int i = s.size()-1;i>=0;i--)

}return

false

; }

bool

operator>(const biginteger& b) const

bool

operator

<=(const biginteger& b) const

bool

operator>=(const biginteger& b) const

bool

operator!=(const biginteger& b) const

bool

operator==(const biginteger& b) const

這時依賴比較運算子的容器函式就可以支援大整數類了。

**彙總:

1 #include 2 #include 3 #include 4 #include 5 #include

6 #include7

using

namespace

std;

8struct

biginteger9//

建構函式

15 biginteger operator=(long

long num)//

賦值運算子

16while(num>0

);23

return *this;24

}25 biginteger operator=(const

string& str)//

賦值運算子

2636

return *this;37

}38 friend ostream& operator

<

3949}50

return

out;51}

52 friend istream& operator>>(istream &in,biginteger&x)

5359

60bool

operator

6166

for(int i = s.size()-1;i>=0;i--)

6772}73

return

false;74

}75bool

operator>(const biginteger& b) const

7679

bool

operator

<=(const biginteger& b) const

8083

bool

operator>=(const biginteger& b) const

8487

bool

operator!=(const biginteger& b) const

8891

bool

operator==(const biginteger& b) const

9295 biginteger operator+(const biginteger& b) const

96105

int x = g;//

g為進製數,滿乙個base才向下進一位

106if(is[i];

107if(ib.s[i];

108 c.s.push_back(x%base);//

進製後本位上的數

109 g = x/base;//

更新進製數

110}

111return

c;112

}113 biginteger operator+=(const biginteger&b)

114118

};119

sets;

120 mapint>m;

121int

main()

122

view code

高精度之大數階乘

大數階乘 序言 今天是我寫部落格的第二天,差點忘了寫,反思一下,下次要早點發。大數階乘也是高精度題目中的入門題。它的主要思路和上一次我發的大數加法相似,也是以陣列來按位處理資料。他的難度級別應該比大數加法還低一點。他的輸入很簡單,也不需要定義多餘的輔助陣列。只需要將需要求階乘的數先輸入到陣列中。再將...

高精度之大數除法

大數除法說的比較少或許不像加法減法那樣簡單,或許是用的不太多。到底怎麼我也不知道。反正你會了加法減法,乘法而不會除法,就像是,開啟電腦而不玩遊戲,心裡難受。我是從看到了大神部落格後學習了一下。部落格中講的很詳細 讓人一看就懂,我很佩服這位同學。果斷的關注了。畢竟別人寫的是別人的。自己寫的才是自己的 ...

基礎演算法 高精度 大整數

學習平台 acwing 高精度的數一般比較大,普通的整型變數存不下,所以存在string裡或者char裡 模擬數學的普通加法 len a 10 9 len b 10 9 為了方便地進行進製操作,將大整數的每一位倒著存放在整形陣列int裡 string a,b vectora,b cin a b fo...