大數相乘問題—轉載

來源:互聯網
上載者:User
演算法題-大數相乘問題

今天在網上看到一個大數相乘的問題,題目是這樣的:輸入兩個整數,要求輸出這兩個數的乘積。輸入的數字可能超過電腦內整形資料的儲存範圍。

分析:

由於數字無法用一個整形變數儲存,很自然的想到用字串來表示一串數字。然後按照乘法的運算規則,用一個乘數的每一位乘以另一個乘數,然後將所有中間結果按正確位置相加得到最終結果。可以分析得出如果乘數為A和B,A的位元為m,B的位元為n,則乘積結果為m+n-1位(最高位無進位)或m+n位(最高位有進位)。因此可以分配一個m+n的輔存來儲存最終結果。為了節約空間,所有的中間結果直接在m+n的輔存上進行累加。最後為了更符合我們的乘法運算邏輯,可以講數字逆序儲存,這樣數位低位就在數組的低下標位置,進行累加時確定下標位置較容易些。

下面是我的解法。

首先是對數組逆序的函數:

按 Ctrl+C 複製代碼

void reverseOrder(char* str, int p, int q)
 {
     char temp;
     while(p < q)
     {
         temp = str[p];
         str[p] = str[q];
         str[q] = temp;
         p ++;
         q --;
     }
 }按 Ctrl+C 複製代碼

然後是完成大數相乘的函數:

 1 char* multiLargeNum(char* A, char* B) 2 { 3     int m = strlen(A); 4     int n = strlen(B); 5     char* result = new char[m+n+1]; 6     memset(result, '0', m+n); 7     result[m+n] = '\0'; 8     reverseOrder(A, 0, m-1); 9     reverseOrder(B, 0, n-1);10 11     int multiFlag; // 乘積進位12     int addFlag;   // 加法進位13     for(int i=0; i <= n-1; i++) // B的每一位14     {15         multiFlag = 0;16         addFlag = 0;17         for(int j=0; j <= m-1; j++) // A的每一位18         {19             // '0' - 48 = 020             int temp1 = (A[j] - 48) * (B[i] - 48) + multiFlag;21             multiFlag = temp1 / 10;22             temp1 = temp1 % 10;23             int temp2 = (result[i+j] - 48) + temp1 + addFlag;24             addFlag = temp2 / 10;25             result[i+j] = temp2 % 10 + 48; 26         }27         result[i + m] += multiFlag + addFlag;28     }29     reverseOrder(result, 0, m+n-1); // 逆序回來30 31     return result;32 }

最後是測試程式:

 1 int main() 2 { 3     char A[] = "962346239843253528686293234124"; 4     char B[] = "93459382645998213649236498"; 5     char *res = multiLargeNum(A, B); 6     if(res[0] != 48) 7         printf("%c", res[0]); 8     printf("%s", res+1); 9     delete [] res;10     return 0;11 }

時間複雜度分析:

3個逆序操作的時間分別為O(n)、O(m)、O(m+n),雙重迴圈的時間複雜度為O(mn),則總的時間複雜度為O(mn + (m+n)),通常m+n << mn,因此可近似認為為O(mn)。而且,逆序操作只是為了思考更容易,完全可以去掉。

空間複雜度為O(m+n)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.