高精度乘法

题来源于洛谷P1303 A*B Problem

链接:

P1303 A*B Problem - 洛谷

题目背景

高精度乘法模板题。

题目描述

给出两个非负整数,求它们的乘积。

输入格式

输入共两行,每行一个非负整数。

输出格式

输出一个非负整数表示乘积。

输入输出样例

输入

1

2

输出

2

说明/提示

每个非负整数不超过 10^2000。

cpp 复制代码
#include <iostream>
#include <cmath>
#include <string>

using namespace std;
string fun(string str1, string str2);
string reverse(string str);

int main()
{
	string str1, str2;//1234512345123456    6543265432654321
	//    6543265432654321 4
	cin >> str1 >> str2;
	int next = 0;
	string sum = "";
	string SUM = "";
	bool flag = false;
	for (int i = 0; i < str2.length(); i++)
	{
		for (int j = 0; j < str1.length(); j++)
		{
			int temp = 0;
			int a = str1[str1.length() - 1 - j] - '0'; // j对应str1的位
			int b = str2[str2.length() - 1 - i] - '0'; // i对应str2的位

			if (flag == true)//如果上次有进位,则加上进位数
			{
				temp += next;
				
				flag = false;
			}
			if (a * b >= 10 || a * b + next >= 10)//标记进位
			{
				flag = true;
				next = a * b / 10;//记录进位数,1
			}
			if (temp + (a * b % 10) >= 10)
			{
				next++;
			}
			temp += a * b;
			temp %= 10;
			SUM += to_string(temp);
		}
		if (flag == true)
		{
			SUM += to_string(next);
			flag = false;
			next = 0;
		}//至此,SUM为"62952959529595293"
		SUM = reverse(SUM);//倒转字符串
		int k = i;
		while (k > 0)
		{
			if (str1 == "0" || str2 == "0")
			{
				break;
			}
			SUM += '0';
			k--;
		}
		//cout << SUM << endl;
		sum = fun(sum, SUM);//求和
		SUM = "";//清空SUM
	}
	cout << sum << endl;
	return 0;
}

//输入两个字符串求和,int相加,string返回
string fun(string str1, string str2)
{
	string SUM = "";

	string sum = "";// 结果字符串
	bool flag = false;
	int max = (str1.length() > str2.length()) ? str1.length() : str2.length();// 取两个字符串最大长度
	for (int i = 0; i < max; i++)// 遍历次数为最大长度
	{
		int a, b;
		if (i < str1.length())
		{
			a = str1[str1.length() - 1 - i] - '0';//str1的末位数字
		}
		else
		{
			a = 0;
		}
		if (i < str2.length())
		{
			b = str2[str2.length() - 1 - i] - '0';//str2的末位数字
		}
		else
		{
			b = 0;
		}
		int c = a + b;// 计算和
		string d;

		//先判断是否有进位
		if (flag == true)
		{
			c += 1;
			flag = false;
		}

		if (c >= 10)
		{
			// 进位
			flag = true;
			c -= 10;//只记录各位数字之和,进位由下次计算决定
			d = c + '0';// 转换为字符串
			sum = sum + d;// 字符串相加
		}
		else
		{
			flag = false;// 无进位
			d = c + '0';// 转换为字符串
			sum = sum + d;// 字符串相加
		}
	}

	// 处理最后一位是否有进位
	if (flag == true)
	{
		sum = sum + "1";
	}

	for (int i = sum.length() - 1; i >= 0; i--)
	{
		SUM = SUM + sum[i];// 字符串相加
	}

	//返回相加
	return SUM;//预计第一次为4734,第二次为44184
}

//倒转字符串
string reverse(string str)
{
	string reversed = "";
	for (int i = str.length() - 1; i >= 0; i--)
	{
		reversed += str[i];
	}
	return reversed;
}
相关推荐
find1star4 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing4 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21124 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP5 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN5 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218316 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤6 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate7 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran7 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹7 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统