力扣43字符串相乘

题目

请点击

思路

整体就是 手算是怎么算的 代码基本就是怎么敲的
在这里插入图片描述

  • 先用len1和len2表示两个需要计算的字符串的长度,然后,判断哪个字符串更长一点,总是让len2和num2做更短的那个。这样总是让短中的每个字符去乘以长中的字符(尽量少算几次)
  • 两层反向的for循环,且用一个整型的数组盛放每次乘积的结果,并判断乘积是否大于10,若大于则进位(这里需要注意的就是乘积是有可能是20+或30+的,所以进位的数字不应该仅仅是+1的,第一次就是掉了这个坑)
  • 然后,就是倒序将数字中的乘积结果再转为字符串的形式
  • 注意:若两个字符串有一个是“0”,返回结果也应该是“0”(字符串)而不是0(整型)(这个又是掉了一次坑)

代码

#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
string multiply(string num1, string num2) {
    
    
	if(num1=="0"||num2=="0") return "0";//0乘以任何数都是0,注意返回的得是“0”(字符串0,而不是整型0)
	
    int len1=num1.length();
    int len2=num2.length();
    string mul;
    vector<int> muls(len1+len2);
    if(len1<len2){
    
    //每回都让len2和num2是较短的那个字符串
        swap(num1,num2);
        swap(len1,len2);
    } 
    //开始相乘
    int pos1=0;//乘数的在个位从个位开始,在百位的从百位开始...pos1是控制本次相乘从哪开始的
    for(int i=len2-1;i>=0;i--){
    
    
        int pos2=0;//乘积结果现在是第几个了
        for(int j=len1-1;j>=0;j--){
    
    
            muls[pos1+pos2] += (num2[i]-'0')*(num1[j]-'0');
            if(muls[pos1+pos2]>9){
    
    
                int cnt=muls[pos1+pos2]/10;//判断目前结果是10的几倍
                muls[pos1+pos2+1] += cnt;//向高位进位
                muls[pos1+pos2] -= cnt*10;//本位减
            }
            pos2++;
        }
        pos1++;
    }
    //开始倒序转为字符串
    int size=muls.size();
    int k=size-1;
    for(k;k>=0;k--)
        if(muls[k]!=0) break;
    for(k;k>=0;k--){
    
    
        mul += (muls[k]+48);
    }
    return mul;
}
int main(){
    
    
    string num1, num2;
    cin>>num1>>num2;
    string mul=multiply(num1, num2);
    cout<<mul<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/thwwu/article/details/116999556
今日推荐