题来源于洛谷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;
}