借数组实现大整数乘法

思想:

用字符串来控制输入,数组来存储,数组的低位存整数的低位,高位来存储高位,

和:计算的过程基本上和小学生列竖式做加法相同。

差:跟和差不多

乘:计算的过程基本上和列竖式做乘法相同。为编程方便,并不急于处理进位,而将进位问题留待最后统一处理

除:基本的思想是反复做减法,看看从被除数里最多能减去多少个除数,商就是多少。一个一个减显然太慢,如何减得更快一些呢?以7546除以23 为例来看一下:开始商为0。先减去23 的100 倍,就是2300,发现够减3 次,余下646。于是商的值就增加300。然后用646 减去230,发现够减2次,余下186,于是商的值增加20。最后用186 减去23,够减8 次,因此最终商就是328。
n的核心是要写一个大整数的减法函数,然后反复调用该函数进行减法操作。 计算除数的10倍、100 倍的时候,不用做乘法,直接在除数后面补0 即可。

在做数据结构题目的时候遇到了这题,以下参考了的博客 自己也重新写了一个大整数乘法的算法(200位以内),基本思想差不多,其中数据类型的转换是一个麻烦事,一个巧妙地做法是完成计算后再进行进位运算,感谢!

// 2018/10/14
// 大整数的乘法 用数组实现
// By Yaaazi🦆

#include <iostream>
#include <string>
using namespace std;
int main()
{

	const int MAX_SIZE = 200;
	string str1, str2;
	cin >> str1;
	cin >> str2;
	int str1Int[MAX_SIZE], str2Int[MAX_SIZE], str3Int[2 * MAX_SIZE];
	for (int k = 0; k < MAX_SIZE; k++) {
		str1Int[k] = 0;
		str2Int[k] = 0;
	}
	for (int k = 0; k < 2 * MAX_SIZE; k++)str3Int[k] = 0;
	int lengStr1 = str1.length();
	int lengStr2 = str2.length();
	for (int i = 0; i < lengStr1; i++) {
		str1Int[i] = str1[lengStr1 - i - 1] - 48;
	}
	string temp1 = "";
	for (int i = 0; i < MAX_SIZE ; i++) {
		temp1 += to_string(str1Int[i]);
	}
	cout << temp1 <<endl;

	for (int i = 0; i < lengStr2; i++) {
		str2Int[i] = str2[lengStr2 - i - 1] - 48;
	}
	string temp2 = "";
	for (int i = 0; i < MAX_SIZE; i++) {
		temp2 += to_string(str2Int[i]);
	}
	cout << temp2 << endl;


	for (int i = 0; i < lengStr2; i++) {
		for (int j = 0; j < lengStr1; j++) {
			str3Int[i + j] += str1Int[j] * str2Int[i];
		}
	}

	cout << lengStr1 << endl;
	cout << lengStr2 << endl;

	string temp = "";
	for (int i = 0; i < MAX_SIZE * 2; i++) {
		temp += " " + to_string(str3Int[i]);
	}
	cout << temp <<endl;

	for (int i = 0; i < 2 * MAX_SIZE; i++) {
		if (str3Int[i] >= 10) {
			str3Int[i + 1] = (str3Int[i] / 10 + str3Int[i+1]);
			str3Int[i] %= 10;
		}
	}

	string temp3 = "";
	for (int i = 0; i < MAX_SIZE * 2; i++) {
		temp3 += " " + to_string(str3Int[i]);
	}
	cout << temp3 <<endl;
	int lengStr3 = 0;
	for (int i = 2 * MAX_SIZE - 1; i >= 0; i--) {
		if (str3Int[i] != 0) {
			lengStr3 = i + 1;
			break;
		}
	}
	cout << lengStr3<<endl;
	for (int i = lengStr3 - 1; i >= 0; i--)
		cout << str3Int[i];
	return 0;
}


作者:我好想射点什么
来源:CSDN
原文:https://blog.csdn.net/osmkcn/article/details/17058443?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

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