题目一描述
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “123”, num2 = “456”
输出: “56088”
说明:
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
题目二描述
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
main文件
#include "highAcc.h"
string multiply(string num1, string num2) {
HighAcc s1(num1);
HighAcc s2(num2);
return (string)(s1 * s2);
}
int main() {
string s1("2020");
string s2("202");
HighAcc num1(s1);
HighAcc num2(s2);
cout << (string)(num1 + num2) << endl;
cout << multiply(s1, s2);
return 0;
}
.h文件
#pragma once
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class HighAcc {
char m_data[10000];
size_t m_size;
public:
HighAcc(string s):
m_size(s.size())
{
memset(m_data, 0, 10000);
//对s逆序存储
string::reverse_iterator i;
int j = 0;
for (i = s.rbegin(); i != s.rend(); i++) {
m_data[j] = *i - '0';
++j;
}
}
HighAcc() :
m_size(1)
{
memset(m_data, 0, 10000);
}
HighAcc operator + (const HighAcc& s) const {
HighAcc res;
size_t i;
size_t maxsize = m_size > s.m_size ? m_size : s.m_size;
for (i = 0; i < maxsize; i++) {
int tmp = m_data[i] + s.m_data[i] + res.m_data[i];
res.m_data[i] = tmp % 10;
res.m_data[i + 1] = tmp / 10;
}
res.m_size = maxsize + res.m_data[i];
return res;
}
HighAcc operator * (const HighAcc& s) const {
HighAcc res;
size_t i, j;
if (m_size == 1 && m_data[0] == 0 || s.m_size == 1 && s.m_data[0] == 0)
return res;
for (i = 0; i < m_size; i++) {
for (j = 0; j < s.m_size; j++) {
int tmp = m_data[i] * s.m_data[j] + res.m_data[i + j];
res.m_data[i + j] = tmp % 10;
res.m_data[i + j + 1] += tmp / 10;
}
}
res.m_size = m_size + s.m_size - !res.m_data[i + j - 1];
return res;
}
//强转成string类型
operator string() {
string s;
int i;
for (i = m_size - 1; i >= 0; i--) {
s.push_back(m_data[i] + '0');
}
return s;
}
};