问题描述:
用C++实现2个大数相乘。
算法思路:
用指定len的2个整型数组代表2个大数,设乘数为A,被乘数为B,保存结果的数组为buffer,可得buffer的元素总数为A.len + B.len。逆序循环遍历A(从个位到首位),在每次循环体中,取A的一位数与B的每一位数相乘,并且每次乘积都保存到buffer指定位置上(当前拿的A的哪一位,结果的保存就从buffer的哪一位开始保存),注意在保存的时候,buffer该位可能已经有上一次计算的值了,所以应该累加。最后,buffer中保存了结果,但该结果没有进行进位处理,进位处理很简单,如: 0,12,82 ,那么进位之后应该是 (0+,(12+82 / 10) / 10),(12+82 / 10)%10,82%10 == 202。
完整代码:
#include <iostream>
#include <stdlib.h>
#include <memory>
using namespace std;
#define LEN 8
int main(){
int num1[LEN] = { 9, 9, 9, 9, 9, 9, 9,9 };
int num2[LEN] = { 9, 9, 9, 9, 9, 9, 9, 9};
//保存结果的buffer长度最大只可能是LEN+LEN
int len = LEN + LEN;
int* result = new int[len];
//初始化buffer所有元素为0
memset(result, 0, sizeof(int)*(LEN + LEN));
//从个位计算到首位(数组从右到左取元素)
for (int i = LEN - 1; i >= 0; --i){
int curPos = len - 1 - ((LEN - 1) - i);
for (int j = LEN - 1; j >= 0; --j){
//num[i]为乘数,num[j]为被乘数,相当于用乘数当前位的数字乘以被乘数的每一位
/*将相乘结果存入结果buffer,这里curPos为当前乘积结果起始存放的位置,比方说
个位*个位结果就放到个位,个位乘10位结果就放到十位...
注意该buffer当前位置可能已经存了上一个循环保存下来的值了,所以应该用累加*/
result[curPos] += num1[i] * num2[j];
--curPos;
}
}
//在result buffer中,每一位的值很可能需要进位,大于10的就需要进位
for (int i = len - 1; i >= 0; --i){
if (result[i] > 10){
result[i - 1] += result[i] / 10;
result[i] %= 10;
}
}
//输出最终结果,如果前面有0,就不输出0
bool bFound = false;
for (int i = 0; i < len; ++i){
if (bFound == false && result[i] <=0 ){
continue;
}
else{
bFound = true;
cout << result[i] << " ";
}
}
cout << endl;
system("pause");
return 0;
}
运行结果: