超大数字乘法问题(c++)

问题描述

    用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;
} 

运行结果

《超大数字乘法问题(c++)》

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/csjapan/article/details/79365374
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞