高精度演算法

2021-06-27 19:32:37 字數 1770 閱讀 1102

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

實現高精度數值計算,雖然不能利用程式語言提供的基本數值資料型別,但是可以利用字串儲存高精度數,計算的結果同樣儲存在字串中,將高精度數運算轉化為字串運算。以下列舉出高精度數相關運算。

1.大數加法

[cpp]view plain

copy

print?

/*  

* 高精度數 

* 結果儲存在字串a中,字串a初始為0 

* 計算結束,將字串a翻轉即為高精度數a,b的和 

*/void add(char *a, char *b)    

while(i < la) //length of a is greater than b  

while(j < lb) //length of b is greater than a  

if(inc != 0) //at last,if the carry is not 0,store it into a  

a[k++] = inc + '0';    

strrev(a);  

}  

2.大數減法

大數減法相對加法較為複雜,但是只要注意借位操作的正確性,還是能夠較為輕鬆寫出正確的大數減法運算的。

[cpp]view plain

copy

print?

//高精度數減法

string sub(string num1, string num2)  

k=0;  

for(i = len1 - 1; i >= 0; i--)  

a[k++] = num1[i] - '0';  

k = 0;  

for(i = len2 - 1; i >= 0; i--)  

b[k++] = num2[i] - '0';  

for(i = 0; i <= len - 1; i++)  

else

a[i] = a[i] - b[i];  

}  while(a[len] == 0 && len > 0 || len >= max)   

len--;  

for(i = len; i >= 0; i--)   

return ans;  

}  

3.大數乘法

大數乘法利用了大數加法的思想,需要注意的是進製的操作。

[cpp]view plain

copy

print?

/** 返回兩個大數相乘的結果

*/string multiple(string a, string b)  

if(remain != 0)  

tmp = 0;  

m = result.length() - (a.length() - i);  

n = str.length() - 1;  

remain = 0;  

while(m >= 0 && n >= 0)   //add str to result

while(m >= 0)  

while(n >= 0)  

if(remain != 0)  

}  return result;  

演算法 高精度乘法2(高精度乘高精度)

題目描述 高精度乘,求兩個很大的非負整數相乘的結果。輸入 2個非負整數,每個一行,每個整數不超過240位。輸出 乙個整數,表示相乘的結果。例子 為了和演算法對應方便,用上面數乘下面數的方法12 5 2512 5502 5312 5為了運算方便,將上面兩數倒置,得到的結果也為倒序下標0 1234 56...

高精度演算法 791 高精度加法

給定兩個正整數,計算它們的和。輸入格式 共兩行,每行包含乙個整數。輸出格式 共一行,包含所求的和。資料範圍 1 整數長度 100000 輸入樣例 1223 輸出樣例 35注意點 1.兩個整數較大,用字串來存,這樣的話,可以呼叫它的size 方法 2.將兩個大的整數,存入vector陣列中,最好把整數...

高精度演算法

任務 高精度,計算大數乘小數 引數 乘法函式mul引數為 被乘數a,儲存最終結果的ans陣列,乘數b 結果 ans陣列中ans 0 為最高位,以此類推 include include using namespace std void mul char a,char ans,int b 任務 高精度,...