给你两个数a和b,这两个数很大,然后输出这两个数相加的和,相乘的积。
模拟,但是还是搜了搜代码实现,发现这个大佬写的是真的简洁高效。
下面第一个代码转自博客(修改了一些) 》》》https://blog.csdn.net/hacker00011000/article/details/51298294
第二个代码是CZH同学的代码,代码更是简单易懂!
#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
//C++大数相加
string BigNumAdd(const string& strNum1, const string& strNum2)
{
string strSum;
int len1 = strNum1.size()-1;
int len2 = strNum2.size()-1;
int bit = 0; //保存进位
//从结尾开始每位相加
while (len1>=0 && len2>=0)
{
//求每位的和(要把进位也加上)
int tmpSum = strNum1[len1]-'0' + strNum2[len2]-'0' + bit;
//保存进结果
strSum += tmpSum % 10 + '0';
//求进位
bit = tmpSum / 10;
--len1;
--len2;
}
//两个整数长度不相等(肯定有一个已经加完了,不需要再额外加if来判断,因为while就可以判断)
while (len1 >= 0)
{
//和上个while循环一样
int tmpSum = strNum1[len1]-'0' + bit;
strSum += tmpSum % 10 + '0';
bit = tmpSum / 10;
--len1;
}
while (len2 >= 0)
{
//和上个while循环一样
int tmpSum = strNum2[len2]-'0' + bit;
strSum += tmpSum % 10 + '0';
bit = tmpSum / 10;
--len2;
}
//最高位有进位
if (bit != 0)
strSum += bit + '0';
//反转
reverse(strSum.begin(), strSum.end());
return strSum;
}
//C++大数相乘
string BigNumMultiply(const string& strNum1, const string& strNum2)
{
string strMultiply;
//两数相乘最大有m+n位
int bit = 0;
int len1 = strNum1.size()-1;
int len2 = strNum2.size()-1;
//计算每一位
for (int i=0; i<len1+len2+2; ++i)
{
//计算结果的第i位(权值肯定为i,第1位也就是个位权值为0(pow(10, 0)))
//等于乘数的第(i~0)位分别与被乘数的第(0~i)位相乘,因为这样每位相乘之后权值仍为i
//然后相加再加上前一位的进位,就是结果的第i位
//然后%10得出第i位,/10得到进位
int tmp = 0;
for (int j=i; j>=0; --j)
{
//如果下标超出字符串的范围 j为num1的下标, i-j为num2的下标,然后两数相乘
if (j>len1 || (i-j)>len2)
continue;
//还要注意字符串数字的最高位在字符串的最低位所以得用len减去
tmp += (strNum1[len1-j]-'0') * (strNum2[len2-(i-j)]-'0');
}
//加上进位
tmp += bit;
//为了防止最后一位是0,但是却加上了
if (tmp == 0 && i == len1+len2+1)
break;
//求余得到结果的第i位
strMultiply += tmp % 10 + '0';
//计算新的进位
bit = tmp / 10;
}
//判断结果的最后一个字符如果是0的话说明可以删去
//if (strMultiply[strMultiply.size()-1] == '0')
// strMultiply[strMultiply.size()-1] = '\0';
//反转
reverse(strMultiply.begin(), strMultiply.end());
return strMultiply;
}
int main()
{
string str1;
string str2;
cin >> str1 >> str2;
//相加和相乘
cout << BigNumAdd(str1, str2) << endl;
cout << BigNumMultiply(str1, str2) << endl;
return 0;
}
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 10010;
int a[maxn],b[maxn];
int ans[maxn];
int ans2[maxn];
int main()
{
string s1,s2;
cin>>s1>>s2;
int len1 = s1.length();
int len2 = s2.length();
int lenans = 0, lenans2 = 0;
int n = 0;
for(int i=0;i<len1;i++)
a[i] = s1[i]-'0';
reverse(a, a+len1);
for(int i=0;i<len2;i++)
{
b[i] = s2[i]-'0';
n = n*10 + s2[i]-'0';
}
reverse(b, b+len2);
for(int i=0,up=0;i<maxn;i++)
{
ans[i] = a[i]+b[i]+up;
up = ans[i]/10;
ans[i] %= 10;
}
for(int i=maxn-1;i!=-1;i--)
{
if(ans[i])
{
lenans = i;
break;
}
}
for(int i=lenans;i!=-1;i--)
cout<<ans[i];
cout<<endl;
for(int i=0;i<maxn;i++)
{
ans2[i] = a[i]*n+ans2[i];
ans2[i+1] = ans2[i]/10;
ans2[i] %= 10;
}
for(int i=maxn-1;i!=-1;i--)
{
if(ans2[i])
{
lenans2 = i;
break;
}
}
for(int i=lenans2;i!=-1;i--)
cout<<ans2[i];
cout<<endl;
return 0;
}
A+B and A*B problem 大数相加 相乘 模拟
原文:https://www.cnblogs.com/alking1001/p/11574812.html