大數運算是一類演算法應用,在密碼學中比較常用。這裡先完成一個最基本,最簡單的大數運算-大非負整數加法運算。大整數通常指計算結果超出int儲存範圍的,亦即會產生溢出的情況。比如32位不帶正負號的整數最大為:2^32-1=4294967295所以接下來的演算法就是要完成諸如4294967200 + 4294967220 = 8589934420這樣的運算。 解題步驟:首先,從直觀問題入手,為了保證能對任意位元整數進行運算,通常我們要給出兩個整數字串用以相加 str1 + str2, 然後,將str1 與 str2轉換成整數數組int a[], b[],逐位進行加法運算,並保留結果與進位值。 註:因為是加法運算,所以結果的位元最多是maxsize(a,b) + 1位最後,輸出結果。
比如 362 + 1698 = 2060 則: num1[] = {2, 6, 3, 0, 0} num2[] = {8, 9, 6, 1, 0} 從最低位起進行計算: num1[0] + num2[0] = 2+8 = 10, 則num1[0] = 0, num1[1] = 6+1 = 7 num1[1] + num2[1] = 7+9 = 16, 則num1[1] = 6, num1[2] = 3+1 = 4 num1[2] + num2[2] = 4+6 = 10, 則num1[2] = 0, num1[3] = 0+1 = 1 num1[3] + num2[3] = 1+1 = 2, 則num1[3] = 2, num1[4] = 0+0 = 0 num1[4] + num2[4] = 0+0 = 0, 則num1[4] = 0 現在結果儲存在num1[]中{0, 6, 0, 2, 0}, 當然應該反向輸出 2060 偽碼如下:
string Add(string s1, string s2)
{
int num1[] <- s1;
int num2[] <- s2;
int len = max(s1.length(), s2.length());
for i = 0 to len-1
{
num1[i] = num1[i] + num2[i];
if (num1[i] >= 10)
{
num1[i] -= 10; //將兩位整數相加結果的個位儲存在num1[i]中
num1[i+1]++; //將兩位整數相加結果的十位,即進位加到num1[i+1]中,以備下一步計算
}
}
string res <- num1;
return res;
} 代碼實現:#include <string>
#include <iostream>
#include <cstddef>
#include <algorithm>
using std::string;
using std::cout;
using std::cin;
using std::max;
using std::endl;
string Add(const string& s1, const string& s2)
{
//int num1[] <- s1;
//int num2[] <- s2;
int len = max(s1.length(), s2.length());
int* num1 = new int[len+1];
int* num2 = new int[len+1];
for (int i=0; i<=len; ++i)
{
num1[i] = 0;
num2[i] = 0;
}
int len1, len2;
len1 = s1.length();
len2 = s2.length();
for (int i=len1-1, j=0; i>=0; --i, ++j)
{
num1[j] = s1[i] - '0';
}
for (int i=len2-1, j=0; i>=0; --i, ++j)
{
num2[j] = s2[i] - '0';
}
//add every int element in array
for (int i=0; i<len; ++i)
{
num1[i] += num2[i];
if (num1[i] >= 10)
{
num1[i] -= 10;
num1[i+1]++;
}
}
//store result.
string ret;
if (len==1)
{
ret.push_back('0'+ num1[0]);
}
else
{
int i = len;
while(num1[i] == 0)
--i;
for (i; i>=0; --i)
{
ret.push_back('0'+ num1[i]);
}
}
delete []num1;
delete []num2;
return ret;
}
int main()
{
string str1,str2;
cin>>str1>>str2;
string ret;
ret = Add(str1, str2);
cout << ret << endl;
return 0;
}
測試案例: 0+0, 1+0, 865799657896+972662725627
最後達到的效果應該是理論上可以對任何位大的整數進行計算,只要記憶體容量允許。