首页 > 编程语言 >【每周例题】力扣 C++ 字符串相乘

【每周例题】力扣 C++ 字符串相乘

时间:2024-05-25 18:13:43浏览次数:30  
标签:ansArr num1 num2 int sum C++ 力扣 相乘 例题

字符串相乘

题目

字符串相乘

题目分析

1.首先,题目上标出了一条:注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。这就是这道题的难度所在

2.这样子的话,我们可以从手写乘法计算来寻找思路:

 ①首先我们需要将各位相乘的结果放入数组ansArr中,我们使用双重for循环计算num1与num2相乘

 ②我们将相乘的结果放入ansArr中,最后再进行进位计算

代码

#include <iostream>  
#include <string>  
#include <vector>  

using namespace std;

int main() 
{
    string num1, num2;
    cin >> num1 >> num2;

    //0乘任何数为0
    if (num1 == "0" || num2 == "0") 
    {
        cout << "0";
        return 0;
    }

    //计算num1,num2长度
    int m = num1.size(), n = num2.size();
    vector<int> ansArr(m + n, 0); // 初始化为0  

    //计算乘法
    for (int i = m - 1; i >= 0; i--) 
    {
        int x = num1[i] - '0';
        for (int j = n - 1; j >= 0; j--) 
        {
            int y = num2[j] - '0';
            int sum = ansArr[i + j + 1] + x * y;
            //进位
            ansArr[i + j + 1] = sum % 10;
            ansArr[i + j] += sum / 10;
        }
    }

    string ans;
    bool leadingZero = true; // 用于跳过前导零  
    for (int i = 0; i < m + n; i++) 
    {
        if (ansArr[i] != 0 || !leadingZero) 
        {
            leadingZero = false;
            ans.push_back(ansArr[i] + '0'); // 将整数转换为字符  
        }
    }

    cout << ans;
    return 0;
}

 力扣代码:

class Solution {
public:
    string multiply(string num1, string num2) 
    {
        if (num1 == "0" || num2 == "0") 
            return "0";

        int m = num1.size(), n = num2.size();
        vector<int> ansArr(m + n, 0); // 初始化为0  

        for (int i = m - 1; i >= 0; i--) 
        {
            int x = num1[i] - '0';
            for (int j = n - 1; j >= 0; j--) 
            {
                int y = num2[j] - '0';
                int sum = ansArr[i + j + 1] + x * y;
                ansArr[i + j + 1] = sum % 10;
                ansArr[i + j] += sum / 10;
            }
        }

        string ans;
        bool leadingZero = true; // 用于跳过前导零  
        for (int i = 0; i < m + n; i++) 
        {
            if (ansArr[i] != 0 || !leadingZero) 
            {
                leadingZero = false;
                ans.push_back(ansArr[i] + '0'); // 将整数转换为字符  
            }
        }

        return ans;
    }
};

  

 

标签:ansArr,num1,num2,int,sum,C++,力扣,相乘,例题
From: https://www.cnblogs.com/hcrzhi/p/18212734

相关文章

  • 『C++初阶』第四章--- 模板初级
    1.泛型编程    如何实现一个适合于所有类型的通用的交换函数呢?voidSwap(int&left,int&right){inttemp=left;left=right;right=temp;}voidSwap(double&left,double&right){doubletemp=left;left=right;right=temp;}voidSwap(ch......
  • C++基础知识学习笔记(5)——函数
    学习参考:https://www.bilibili.com/video/BV1et411b73Z?p=95&spm_id_from=pageDriver&vd_source=cc561849591f6a210152150b2493f6f3函数函数的默认参数可以为形参提供默认值。intadd(inta,intb=1,intc=2){ returna+b+c;}intmain(){ cout<<(add(1,3,......
  • C++容器之无序集(std::unordered_set)
    目录1概述2使用实例3接口使用3.1construct3.2assigns3.3iterators3.4capacity3.5find3.6count3.7equal_range3.8emplace3.9emplace_hint3.10insert3.11erase3.12clear3.13swap3.14bucket_count3.15max_bucket_count3.16bucket_s......
  • Java 多线程编程 力扣实题
    多线程编程实例了解内存模型、线程通信和线程安全之后,对多线程编程已经有了理论上的认知,现在来实战一下。所有题目在https://leetcode.cn/problemset/concurrency/。按序打印题干描述给你一个类:publicclassFoo{publicvoidfirst(){print("first");}publicvoidseco......
  • 原始字面常量(C++11)
    原始字面常量(C++11)文章目录原始字面常量(C++11)前言一、原始字面量二、代码示例总结前言字面量一般是指数值(12、454等)和字符串(“Hw”、“h\t”),但是有时候我们想表达字符原始的意义,不想进行转义,比如说"h\t"字符串中‘\t’表达的意思是制表符即进行了转义,C++11添加了......
  • C++基础知识学习笔记(4)——引用
    学习参考:https://www.bilibili.com/video/BV1et411b73Z?p=89&spm_id_from=pageDriver&vd_source=cc561849591f6a210152150b2493f6f3引用作用:给变量起别名语法:数据类型&变量=原变量;intmain(){ inta=10; int&b=a; b=20; cout<<b<<endl;//20 co......
  • 线段树维护区间字符的两道例题(CF240F CF558E)
    CF240F:https://www.luogu.com.cn/problem/CF240F题目大意:给定一个长为n的由a到z组成的字符串,有m次操作,每次操作将[l,r]的字符串进行重排,得到字典序最小的字符串,输出m次操作后的字符串。大致思路:1.首先我们要想区间内的字典序最小的回文串要怎么构造。回文串无非就两种类型:有一......
  • C++ - 比较两个浮点数大小
    简介两个浮点数不能直接使用 ==来确定相等,因为浮点数精度可能导致微小的误差 方法一:使用std::abs()函数来比较两个浮点数的差值是否小于一个非常小的阈值floata=1.5;floatb=2.3;floatepsilon=1e-9;if(std::abs(a-b)<epsilon){cout<<"aiseq......
  • C++基础知识学习笔记(3)
    资料来源https://www.bilibili.com/video/BV1et411b73Z?p=84&vd_source=cc561849591f6a210152150b2493f6f3核心内容程序的内存模型代码区全局区在函数外面声明了全局变量,在main函数里面创建了局部变量,打印了其地址:静态变量:在普通变量前面加一个static,属于静态变量。静......
  • 【C++】回文数判断(for循环,简易思路)
    #include<stdio.h>#include<string.h>#include<iostream>usingnamespacestd;intmain(){chara[1001];intn,i,j;cin>>a;//输入字符串,注意:这里不会处理空格n=strlen(a);/......