日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法题-大数相乘问题

發布時間:2024/10/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法题-大数相乘问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

分析:

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

下面是我的解法。

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

1 void reverseOrder(char* str, int p, int q) 2 { 3 char temp; 4 while(p < q) 5 { 6 temp = str[p]; 7 str[p] = str[q]; 8 str[q] = temp; 9 p ++; 10 q --; 11 } 12 }

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

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 = 0 20 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)

轉載于:https://www.cnblogs.com/jason-yang/archive/2012/04/26/2472755.html

總結

以上是生活随笔為你收集整理的算法题-大数相乘问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。