题解

题目难度:中等难度
知识点:字符串、大数相乘

模拟人工计算

计算的过程基本上和小学生列竖式做乘法相同。为编程方便,并不急于处理进位,而将进位问题留待最后统一处理。
图片说明

数组a存储第一个数字123(逆序)

图片说明

数组b存储第二数组20(逆序)

图片说明

结果存入数组result

图片说明

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
#define MAX 1010
int main(){
    string num1, num2;
    cin>>num1>>num2;
    int len1 = num1.length();
    int len2 = num2.length();
    int a[MAX] = {0};
    int b[MAX] = {0};
    int result[2 * MAX] = {0};
    int i = 0, j = 0;
//将字符串转移到数组中,以方便计算 ,倒叙存储
    for(i = len1 - 1, j = 0; i >= 0; i--, j++)  {
        a[j] = num1[i] - '0';
    }
    for(i = len2 - 1, j = 0; i >= 0; i--, j++){
        b[j] = num2[i] - '0';
    }
//将结果储存在 resullt中,result[i + j] = a[i] * b[j]
    for(i = 0; i < len1; i++){
        for(j = 0; j < len2; j++) {
            result[i + j] += a[i] * b[j];
        }
    }
//从低位到高位进行进位

    for(i = 0; i < (len1+len2); i++){
        if(result[i] > 9){
            result[i+1] += result[i]/10;
            result[i] %= 10;
        }
    }
//将前导0全部剔掉,比如我们结果是236,在result中
    for(i = len1 + len2; i >= 0 ; i--){
        if(result[i] == 0) continue;
        else break;
    }
//接着i继续输出,就是我们的结果?
    for(; i >=0; i--)
        cout<<result[i];
    return 0;
}