失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > C++大数相乘(高精度乘法)

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

时间:2019-12-08 03:09:49

相关推荐

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

高精度乘法

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

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

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

具体步骤举例

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

题目要求

来源: https://leetcode-/problems/multiply-strings/description/

实现代码

#include <iostream>#include <string>#include <cstdlib>#include <algorithm>#define CAPACITY 1024using 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';}//消除多余的0while (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;}

如果觉得《C++大数相乘(高精度乘法)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。