如果這兩個數比較小(即能用計算機的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++了實現的時候有點生疏了,如有問題,歡迎批評指正!