C++大数相乘(高精度乘法)

高精度乘法

高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,我们可以将这个数字拆开,拆成一位一位的,或者是几位几位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。

对于这类问题,不要指望long double这些东西了,基本数据类型不可能存的下。我们可以把这两个数当成字符串输入到数组中,然后模拟手动的竖式运算得出结果。

说白了,高精度计算就是解决long long也解决不了的问题。

具体步骤举例

高精度乘法

  • 当然也有其他写法,如在运算中直接进位

题目要求


来源: https://leetcode-cn.com/problems/multiply-strings/description/

实现代码

#include <iostream>
#include <string>
#include <cstdlib>
#include <algorithm>

#define CAPACITY 1024

using namespace std;

class Solution 
{	
public:
	string multiply(string num1, string num2)
	{
		string s;
		if (num1 == "0" || num2 == "0")
		{
			return "0";
		}

		size_t maxL = num1.size() + num2.size();
		int n1[CAPACITY], n2[CAPACITY], sum[CAPACITY];
		int L1 = num1.size(), L2 = num2.size();
		
		//数组全部全置零
		memset(n1, 0, CAPACITY);
		memset(n2, 0, CAPACITY);
		memset(sum, 0, CAPACITY);
		//两个string倒序放入数组中
		for (int i = 0; i < L1; i++)
		{
			n1[i] = num1[L1 - i - 1] - '0';
		}
		for (int i = 0; i < L2; i++)
		{
			n2[i] = num2[L2 - i - 1] - '0';
		}
		//注意理解i + j的含义
		for (int i = 0; i < L1; i++)
		{
			for (int j = 0; j < L2; j++)
			{
				sum[i + j] += n1[i] * n2[j];
			}
		}
		//将数组内每一项该进位的进位
		for (int i = 0; i < num1.size() + num2.size(); i++)
		{
			sum[i + 1] += sum[i] / 10;
			sum[i] %= 10;
		}
		s.reserve(num1.size() + num2.size());
		for (int i = 0; i < num1.size() + num2.size(); i++)
		{
			s += sum[i] + '0';
		}
		//消除多余的0
		while (s[maxL - 1] == '0')
		{
			s.pop_back();
			maxL--;
		}
		reverse(s.begin(), s.end());
		return s;
	}
};

int main()
{/*
	string num1 = "123";
	string num2 = "456";
	Solution s1;
	cout << s1.multiply(num1, num2);
	*/
	Solution s;
	string s1;
	string s2;
	while (cin >> s1 >> s2) 
	{
		cout << s.multiply(s1, s2) << endl;
	}
	
	system("pause");
	return 0;
}
发布了53 篇原创文章 · 获赞 46 · 访问量 7233

猜你喜欢

转载自blog.csdn.net/new_bee_01/article/details/101015047
今日推荐