题目描述
给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B的值。
进位处理时使用以下代码也能过
if(tmp){
if(j + i < sum.size()) sum[j + i] += tmp + '0';
else sum += tmp + '0';
}
但如果在sum[j+i]+tmp时发生进位, 由于只执行一次, 这难道不会导致进位数据丢失吗?
求大佬解惑
C++ 代码
#include <bits/stdc++.h>
using namespace std;
string mul(const string& a, const string& b){
if(a == "0" || b == "0") return "0";
string sum = "";
for(int i = 0; i < a.size(); i++){
int tmp = 0, j = 0;
while(j < b.size()){
//计算当前位a[i]与对应位b[i]的乘积
tmp = (a[i]-'0') * (b[j]-'0') + tmp;
//若当前位不超过sum的界限, 则直接在sum[j+i]处增加; 否则新增
if(j+i < sum.size()) {
tmp += sum[j+i] - '0';
sum[j+i] = tmp%10 + '0';
}
else sum += tmp%10 + '0';
tmp /= 10;
++j;
}
//处理进位
while(tmp){
if(j+i < sum.size()) {
tmp += sum[j+i] - '0';
sum[j+i] = tmp%10 + '0';
}
else sum += tmp%10 + '0';
tmp /= 10;
}
/*处理进位用这个也能过, 但是否有那么一种情况,
当sum[j + i]+tmp时产生进位, if语句导致只对进位进行一次处理, 造成进位的数据丢失?
if(tmp){
if(j + i < sum.size()) sum[j + i] += tmp + '0';
else sum += tmp + '0';
}
*/
}
reverse(sum.begin(), sum.end());
return sum;
}
int main(){
string a, b;
cin >> a >> b;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
if((a.back() == '-' && b.back() != '-') || (a.back() != '-' && b.back() == '-')){
printf("-");
}
cout << mul(a, b);
return 0;
}