高精度 模板

2021-10-03 09:32:24 字數 3490 閱讀 2543

處理大數運算的時候都是用字串存的,高階語言一般也都有大數類,分裝成乙個物件,實際上就是維護了乙個字串,運算就是兩個字串之間的操作,他的運算也有很多啊,畢竟數**算就有很多,簡單的有

大數加大數

大數減大數

大數乘小數

大數除小數

上述幾種都是最常見也是最簡單的,運算的**只有幾行,而且都是模擬字串的方法實現。

實際上大小數可以統一起來,就像能用int的地方用long long 必然是可以的,但明顯那會有一點損耗(時間上或空間上)或許微乎其微,畢竟正常接觸到的位數n不會非常非常**

然後還有其餘的一些操作

大數取餘

三角函式相關

整數小數部分相關運算

先貼一下簡單的幾種,之後的下次再更…

題目 輸入兩個數字(高精度位數 <= 10000,低精度位數 <= 10)

大數加

#include

#include

using

namespace std;

vector<

int>

add(vector<

int> a,vector<

int> b)

if(t) c.

push_back

(t);

return c;

}int

main()

for(

int i = s2.

size()

-1; i >=

0;i--

)auto c =

add(a,b)

;for

(int i = c.

size()

-1; i >=

0; i--

) cout << endl;

return0;

}

需要明確的一點就是,把字串轉換成整數陣列的時候應該是要倒過來的,幾年前第一次聽到這個不是太明白,不過後來也馬上反應過來,為的就是最低位能夠對齊,非常方便運算,運算結束之後再給他倒過去就行了。

上面的大數加就是計算對其的兩位,然後能進製就進一位,每一位應該在[0, 10)上。當然,可能是一長字串和一短字串進行加法,那麼超過短的長度之後都是0了。運算完之後再把結果字串倒序輸出即可。

大數減

#include

#include

using

namespace std;

vector<

int>

sub(vector<

int> a,vector<

int> b)

while

(c.size()

>

1&& c.

back()

==0)return c;

}int

main()

if(s1.

size()

< s2.

size()

||(s1.

size()

== s2.

size()

&& s1 < s2)

) vector<

int> a,b;

for(

int i = s1.

size()

-1;i >=

0;i--

)for

(int i = s2.

size()

-1;i >=

0;i--

)auto c =

sub(a,b)

;for

(int i = c.

size()

-1; i >=

0;i--

) cout << endl;

return0;

}

相對來說大數減法比較麻煩,因為要處理多種情況。要做到大的數字減去小的數字,如果是小的減去大的那麼就把兩個位置換一換,並且輸出乙個負號,我們這裡的計算本身是不帶符號的(需要單獨輸出),如果是高階語言封裝的,它裡面就有乙個單獨的字段存符號。還有乙個需要注意的問題就是前導零,什麼是前導零,比如 123 - 123 = 0,在這裡我們知道這個算式的答案是0,但是按照模擬運算存在陣列裡卻是 000 ,所以我們需要把最前面的零給他刪掉,就有了

while(c.size() > 1 && c.back() == 0) c.pop_back();
這句話有什麼用捏,就是當c長度大於1的時候(乙個0的話沒必要刪了),如果最後乙個是零,就把最後乙個給他pop(刪除)掉,因為是倒序存放的,所以經過這個操作之後,就不會有前導零出現了。

大數乘

#include

#include

using

namespace std;

vector<

int>

mul(vector<

int> a,

int b)

while

(t)return c;

}int

main()

auto c =

mul(a,b)

;for

(int i = c.

size()

-1;i >=

0;i--

) cout << endl;

return0;

}

大數乘小數 和 大數加 很像,區別就是最後有數字多出來不一定是一位數,需要多次插入,如果是大數乘大數,直接兩個迴圈模擬是一樣的。

大數除

#include

#include

#include

using

namespace std;

vector<

int>

divi

(vector<

int>

&a,int b,

int&t)

reverse

(c.begin()

, c.

end())

;while

(c.size()

>

1&& c.

back()

==0)return c;

}int

main()

int t;

auto c =

divi

(a,b,t)

;for

(int i = c.

size()

-1; i >=

0; i--

) cout << endl << t << endl;

return0;

}

高精度除以低精度演算法,返回商和餘數,中間每次運算向前借一位,具體表現就是餘數乘以10,自己列個式子,一步步模擬一下就行。如果不用求餘數,而是要求小數部分,只需要小數部分繼續借位就能繼續算,但是這要乙個小數字數作為引數(提前告知需要求多少位),後導零是不需要刪除的

思想很簡單,直接模擬,**的話直接連續敲個五六遍就行。

高精度模板

include include include includeusing namespace std define maxn 9999 define maxsize 10 define dlen 4 class bignum bignum const int 將乙個int型別的變數轉化為大數 big...

高精度模板

include include include include include using namespace std const int maxn 1000 struct bign bign operator const char num 過載運算子 bign const char num 支援初...

高精度模板

include include include includeusing namespace std define maxn 9999 define maxsize 10 define dlen 4 class bignum 建構函式 bignum const int 將乙個int型別的變數轉化為大...