大家剛開學的時候肯定都做過
a+b吧?今天給大家出一道
a+bplus版:
給定兩個整數a和
b,計算
a + b
的和。(a和
b的範圍都是0~
1e1000
)這道題我們還能用
int或者
long
long
來做嗎?
這時候,由於a和
b的取值範圍遠遠大於資料型別給定的範圍,不能滿足較大規模的高精度數值計算,因此需要利用其他方法來實現高精度數值的計算,於是產生了大數運算。大數運算主要有加、減、乘這三種方法(當然大家也可以試著擴充套件一下其它(比如除法,取模,階乘等等)
對於本題(大數加法): 1
我們要用多大的陣列儲存結果?
2
如何在計算的過程中保證進製?
1 ,由於兩個數最大為
1e1000
,所以和的最大位數是2*
1e1000
,也就是長度為
1000
的陣列。
2 ,
在大數加減中執行完畢後再對儲存結果的
result
陣列進行一次進製
(因為每位中兩個十以內的數相加最多隻進
一位,結果累 積不會造成資料範圍溢位)
例如:
8 1 3 5 7 3 8 7 2 5 8 9 7 1
+ 3 2 9 4 8 1 3 0 9 1 8 9 0 4 9 5 0 1 8 = 3 29 4 8 9 4 3 (14) 8(11)(17)7 6(14)(13) 9 8 9
最後進製,得:
3 2 9 4 8 9 4 4 4 9 2 7 7 7 5 3 9 8 9
對於大數乘法: 1
我們要用多大的陣列儲存結果?
2
如何在計算的過程中保證進製?
1,如果兩個數最大為
1e1000
,所以乘積的最大位數是1e(
1000+1000
),也就是長度為
2000
的陣列。
2, 在大數乘法中可以定義乙個中間過程的二維陣列,
執行完畢後對每一列進行求和,得到結果,最後再對
儲存結果的
result
數 組進行一次進製
例如: 83
975
* 9 3 8 =
(64) (24) (72) (56) (40)
(24) 9 (27) (21) (15)
(72) (27) (81) (63) (45)
也就是:
7 8 7 6 8 5 5 0
我們來看一下**的實現:
//大數加法和乘法(整數運算)
#include#include#include#include#define max 1000
using namespace std;
char a[max],b[max],c[max],result[max];
int bignum_add(char* a,char* b,char* result)
c[k]+=flag;
while(i>=0)
while(j>=0)
for(int i=0;i=0;j--)
if(flag)
c[k++]+=flag;
} for(int i=0;i>a>>b)
; //大數加法
bignum_add(a,b,c);
int len=strlen(c);
int i;
for(i=0;c[i]=='0';i++);//避免高位為0
if(i>=len)
cout<<0;
else
{ for(i=i;i=len)
cout<<0;
else
{ for(i=i;i
長整數加法運算 大數運算
問題描述 假設2個任意長度的整數x y分別由雙向鍊錶a和b儲存,現要求設計乙個演算法,實現x y。計算結果儲存在鍊錶c中。說明 由於a和b輸出時需要從頭至尾遍歷,而做加法時需要從尾至頭遍歷,因此使用雙向鍊錶儲存。可以從長整數的低位開始拆分 4位為一組,即不超過9999的非負整數 依次存放在鍊錶的每個...
大型整數運算 加法, 減法, 乘法
from 用int數模仿真整數的每乙個位,大於10的要進製,負數要借位。include include define max digit 500 大數運算 加法 int multiply int a,int b,int result 大數運算 乘法 int add int a,int b,int r...
演算法 大數加法和大數乘法
大數加法 以字串的形式讀入兩個數字,編寫乙個函式計算它們的和,以字串形式返回。字串長度不大於100000,保證字串僅由 0 9 這10種字元組成 public string solve add string s,string t else if j 0 else int sum x y m m su...