程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 實現大數相乘

C++ 實現大數相乘

編輯:C++入門知識

如果這兩個數比較小(即能用計算機的int、long類型表示,並且相乘後的結果任然能夠表示)那麼直接用計算機

的乘法運算就可以了。這裡的大數指的是用計算機的預設類型(int、long等)無法表示的數,如:11111111111

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111...

算法原理:這個原理其實很簡單,就是我們小學學的算術,兩個數相乘把其中一個數的各位數字乘以另一個數,並

把相乘的結果累加,注意在累加時要補0,比如:一個數的十位上的數乘以另一個數這時計算結果要乘以10,在這裡

我們用字符串保存大數,算法模擬了兩個數相乘的演算過程,最終計算出結果。

\

<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHByZSBjbGFzcz0="brush:java;">//大數乘法 std::string bigDataMultiply(string str1, string str2) { const char* data1 = str1.data(); const char* data2 = str2.data(); int len1=str1.length(); int len2=str2.length(); std::vector result; //將第一個數分解 for (int i = len1 - 1; i >= 0; i--) { int c1 = data1[i] - '0'; int cur = 0; int next = 0; std::vector str1; //第一數的每一位乘以第二個數 for (int j = len2 - 1; j >= 0; j--) { int c2 = data2[j] - '0'; int res = c1 * c2; //向前進位 if (next != 0) res += next; if (res >= 10) { cur = res % 10; next = res / 10; } else { cur = res; next = 0; } str1.push_back(char('0' + cur)); } //判斷最後是否需要進位 if (next != 0) str1.push_back(char('0' + next)); if (result.size() == 0) { for (size_t k = 0; k < str1.size(); k++){ result.push_back(str1[k]); } } else { //除了第一個數位其他的數後面要添一個0 for (int k = 0; k < len1 - 1 - i; k++) str1.insert(str1.begin(), '0'); //大數相加,將結果保存在str1中 int one = 0; int two = 0; int k = result.size(); int h = 0; int num = str1.size(); while (h < num) { int tc; if (k > 0) tc = (str1[h] - '0') + (result[h] - '0'); else tc = str1[h] - '0'; if (two != 0) tc += two; if (tc >= 10) { one = tc % 10; two = tc / 10; } else { one = tc; two = 0; } str1[h]=char(one + '0'); h++; k--; } //判斷最後一位是否需要進一 if (two != 0) str1.push_back(char(two + '0')); result.clear(); for (size_t k = 0; k < str1.size(); k++){ result.push_back(str1[k]); } } } //計算的時候是逆序的,所以需要逆序輸出 int resultLen = result.size(); string resStr; for (int i = 0; i < resultLen; i++) { resStr.push_back(result[resultLen-1-i]); } return resStr; }平常用C#和Java比較多,這個是本人今天上班的時候閒來無事用C++實現的,大笑,可能很久沒用C++了實現的時候有點生疏了,如有問題,歡迎批評指正!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved