大非負整數加法運算

來源:互聯網
上載者:User
大數運算是一類演算法應用,在密碼學中比較常用。這裡先完成一個最基本,最簡單的大數運算-大非負整數加法運算。大整數通常指計算結果超出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

最後達到的效果應該是理論上可以對任何位大的整數進行計算,只要記憶體容量允許。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.