大数相加
题目链接:A + B Problem II
- 思路:该题目的大数相加,两个数的长度均没有超过1000,所有可以直接使用字符串模拟数字相加(包括进位)。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
string add(string s1, string s2)
{
string s3 = "";
int pre = 0;
//将s1和s2首部的0去掉
int st1 = s1.find_first_not_of("0"), st2 = s2.find_first_not_of("0");
s1 = s1.substr(st1, s1.size()-st1), s2 = s2.substr(st2, s2.size()-st2);
//保证s1的长度一定不小于s2,方便操作
if(s1.size()<s2.size()) swap(s1, s2);
int len1 = s1.size(), len2 = s2.size();
int cur1 = len1-1, cur2 = len2-1;
while(cur1>=0 || cur2>=0)//从后向前累加
{
int a = pre;
if(cur1>=0) a += s1[cur1]-'0';
if(cur2>=0) a += s2[cur2]-'0';
pre = a/10;
a = a%10;
s3 = char(a+'0')+s3;
cur1--, cur2--;
}
if(pre)//最高位的进位
s3 = '1'+s3;
return s3;
}
int main()
{
int T, kase = 1;
string a, b;
cin >> T;
while(T--)
{
if(kase>1) cout << endl;
cout << "Case " << kase++ << ":" << endl;
cin >> a >> b;
cout << a << " + " << b << " = ";
cout << add(a, b) << endl;
}
return 0;
}
大数相乘
题目:计算A和B相乘的结果,其中A和B的长度范围在1000以内。
- 思路:用字符串模拟乘法运算,可以将运算过程分为两个过程。1)计算A中每一个位与B相乘的结果,存入一个字符串数组。 2)将字符串数组中的所有结果按对应位相加,存为字符串,可得结果的倒序。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
/*
大数相乘
*/
void multi(string A, string B)
{
string a[10];//记录A的每一位与B的相乘结果
int L1 = A.size(), L2 = B.size(), k = 0;
for(int i=L1-1; i>=0; i--)//A的位数循环
{
int t = A[i]-'0', m = 0;//t是A中每一位,m是进位数
string tmp = "";//储存每一次循环的结果
for(int u=L1-1; u>i; u--)//补零,方便相加操作
tmp += "0";
for(int j=L2-1; j>=0; j--)
{
int c = t*(B[j]-'0')+m;
tmp += c%10+'0';
m = c/10;
}
if(m>0)//有进位
tmp += m+'0';
a[k] = tmp; k++;
}
//将a数组中的结果对应相加
string ans = "";//最终结果,倒序
int p = 0;//进位数
for(int i=0; i<a[k-1].size(); i++)//按最长的一个来循环,结果是倒序
{
int cnt = p;
for(int j=0; j<k; j++)//将a数组中每一个元素的相应j位对应相加
{
if(i<a[j].size())
{
cnt += a[j][i]-'0';
}
}
ans += (cnt%10)+'0';
p = cnt/10;
}
for(int i=ans.size()-1; i>=0; i--)
cout << ans[i];
cout << endl;
}
int main()
{
string A, B;
cin >> A >> B;
multi(A, B);
return 0;
}