[每日一题]20:字符串相乘与相加

题目一描述

给定两个以字符串形式表示的非负整数 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;
	}
};
发布了152 篇原创文章 · 获赞 45 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/AngelDg/article/details/105082192