引言
我们在解决一些问题时,由于数值太大(可能有上万位),往往需要用到高精度运算,而高精度加减法还好说,但是高精度乘高精度,就十分困难了,有的同学只能背代码,而此文提供一个方便的、可移植的模版。
正文
那么我废话不多说,直接上模版:
#include <iostream>
#include <cstring>
const int N = 1e5 + 10;
void multiply(const char* num1, const char* num2, char* result);
int charToDigit(char c) {
return c - '0';
}
char digitToChar(int digit) {
return digit + '0';
}
void multiply(const char* num1, const char* num2, char* result) {
int len1 = std::strlen(num1);
int len2 = std::strlen(num2);
int* tempResult = new int[len1 + len2];
std::memset(tempResult, 0, sizeof(int) * (len1 + len2));
for (int i = len1 - 1; i >= 0; i--) {
for (int j = len2 - 1; j >= 0; j--) {
int product = charToDigit(num1[i]) * charToDigit(num2[j]);
tempResult[i + j + 1] += product;
}
}
for (int i = len1 + len2 - 1; i > 0; i--) {
if (tempResult[i] >= 10) {
tempResult[i - 1] += tempResult[i] / 10;
tempResult[i] %= 10;
}
}
int startIndex = 0;
while (tempResult[startIndex] == 0 && startIndex < len1 + len2 - 1) {
startIndex++;
}
for (int i = startIndex; i < len1 + len2; i++) {
result[i - startIndex] = digitToChar(tempResult[i]);
}
result[len1 + len2 - startIndex] = '\0';
result[len1 + len2] = '\0';
delete[] tempResult;
}
int main() {
char num1[N], num2[N];
std::cin >> num1 >> num2;
char result[20];
multiply(num1, num2, result);
std::cout << result << std::endl;
return 0;
}
需要用的读者可以粘贴main函数之上的代码到你的源代码/项目中,使用时需要两个字符数组,作为两个因数,并调用以这两个char数组为参数的multiply函数,结果则存放在result数组中。
希望此模版对您有帮助,另祝各位csp-js、noi的选手们拿到省一!
拓展
高精度快速幂模版:
#include <iostream>
#include <vector>
using namespace std;
// 高精度乘法
vector<int> multiply(vector<int>& a, vector<int>& b) {
vector<int> result(a.size() + b.size(), 0);
for (int i = 0; i < a.size(); i++) {
int carry = 0;
for (int j = 0; j < b.size(); j++) {
int temp = a[i] * b[j] + carry + result[i + j];
carry = temp / 10;
result[i + j] = temp % 10;
}
result[i + b.size()] = carry;
}
// 去掉前导零
while (result.size() > 1 && result.back() == 0) {
result.pop_back();
}
return result;
}
// 高精度快速幂
vector<int> powMod(vector<int>& base, int exponent, int modulus) {
string binary = "";
while (exponent > 0) {
binary = to_string(exponent % 2) + binary;
exponent /= 2;
}
vector<int> result = {1};
vector<vector<int>> powers;
powers.push_back(base);
for (int i = 1; i < binary.length(); i++) {
powers.push_back(multiply(powers[i - 1], powers[i - 1]));
for (int j = 0; j < powers[i].size(); j++) {
powers[i][j] %= modulus;
}
}
for (int i = 0; i < binary.length(); i++) {
if (binary[i] == '1') {
result = multiply(result, powers[i]);
for (int j = 0; j < result.size(); j++) {
result[j] %= modulus;
}
}
}
while (result.size() > 1 && result.back() == 0) {
result.pop_back();
}
return result;
}
int main() {
vector<int> base = {1145};
int exponent = 14;
int modulus = 1000000007;
vector<int> result = powMod(base, exponent, modulus);
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i];
}
cout << endl;
return 0;
}
如果有什么不懂的问题,欢迎私信问我!