由於c語言的資料型別能存放的數字大小有一定的限制。
如整型int表達範圍是(−231
-2^−2
31~2 31−
12^-1
231−1)
無符號整數unsigned long是(0~ 232−
12^-1
232−1)
浮點型double只能提供15~16位的有效數字。
因此,在計算位數超過十幾位的數時,不能採用現有的資料型別,只能自己程式設計計算。
高精度演算法(high accuracy algorithm)是處理大數字的數學計算方法。在一般的科學計算中,會經常算到小數點後幾百位或者更多,當然也可能是幾千億幾百億的大數字。一般這類數字我們統稱為高精度數,高精度演算法是用計算機對於超大資料的一種模擬加,減,乘,除,乘方,階乘,開方等運算。對於非常龐大的數字,我們將這個數字拆開,存放在乙個陣列裡作為乙個數字,這樣的數就被稱為是高精度數。高精度演算法就是能處理高精度數各種運算的演算法。
本文只簡單介紹最基本的高精度操作。
我們輸入的數字遠超long long等c語言基本資料型別的表示範圍,因此我們要把輸入的資料作為字元型別陣列讀取進我們的程式裡。
此外,為了方便進行計算(對齊個位、方便處理進製),我們還需要把讀取進來的陣列逆序放進乙個int陣列裡。相應的,輸出也應逆序。
**如下。
#include
#include
struct asdf
;char a[
1001];
void
change
(char
*a,asdf *a)
void
scan
(asdf *a)
void
print
(asdf a)
intmain()
用豎式計算7685+3419。
#include
#include
struct asdf
;char a[
1001];
void
change
(char
*a,asdf *a)
void
scan
(asdf *a)
void
print
(asdf a)
asdf plus
(asdf a,asdf b)
intmain()
用豎式計算7685-3419。
#include
#include
struct asdf
;char a[
1001];
void
change
(char
*a,asdf *a)
void
scan
(asdf *a)
void
print
(asdf a)
intcompare
(asdf a,asdf b)
asdf minus
(asdf a,asdf b)
ans.n=
(a.n>b.n?a.n:b.n)
;//和的長度不大於被減數的長度
for(
int i=
1;i<=ans.n;
++i) ans.x[i]
=a.x[i]
-b.x[i]
;for
(int i=
1;i++i)
//處理借位
if(ans.x[i]
<
0) ans.x[i]+=
10,ans.x[i+1]
--;while
(ans.x[ans.n]==0
&&ans.n>
1) ans.n--
;//去前導零
return ans;
}int
main()
不使用豎式,計算128712*2。
#include
#include
struct asdf
;char a[
1001];
void
change
(char
*a,asdf *a)
void
scan
(asdf *a)
void
print
(asdf a)
asdf times
(asdf a,
int b)
while
(x) ans.x[
++ans.n]
=x%10
,x/=10;
return ans;
}int
main()
用豎式計算542*768。
高精度計算
最近做了一些高精度計算問題,一般來說解題辦法都差不多,都是通過字串來操作的,下面是解題模板。清零操作 string clearstr string s if s return s 0 while s.length 0 s 0 0 s.erase 0,1 刪除第乙個零 if s return s 0 ...
高精度計算
include include includeusing namespace std const int l 110 string add string a,string b 只限兩個非負整數相加 nb l int la a.size lb b.size for int i 0 ilb la lb ...
高精度計算
一.高精度儲存 1.如對數採用的字串輸入 include include using namespace std const int n 100 最多100位 int main 2.直接讀入 include using namespace std const int n 100 最多100位 int...