【每日挠头算法(4)】字符串相加|字符串相乘

news2024/11/27 17:45:36

欢迎~

  • 一、字符串相加
    • 思路:模拟竖式加法
      • 具体代码如下:
  • 二、字符串相乘
    • 思路:模拟竖式乘法
      • 具体代码如下:
  • 总结


一、字符串相加

点我直达~

在这里插入图片描述

思路:模拟竖式加法

  • 1.将两个字符串从右往左开始进行相加,使用一个变量ans表示进位,如果两个字符串的个位加法和大于10,那么让进位+1,个位和再%10,然后将结果存入到新的字符串strRet
  • 2.两个字符串的十位和十位继续相加,并且需要加上个位的进位ans,步骤同1
  • 3.这样不断相加,假如任意一个字符串的位数加完了,另一个字符串的位数未加完,比如:123+11,那就将该字符串连同上一位的进位ans加上并复制到新的字符串strRet中,注意,在代码的计算时,应该是123+011,11前面的’0’是需要补位的
  • 4.最后将strRet逆置即可得到我们想要的结果。

具体代码如下:

写法1:

class Solution {
public:

    string addStrings(string num1, string num2)
    {
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        string strRet;
        int ans = 0;

        while (end1 >= 0 && end2 >= 0)
        {
            int sum = (num1[end1]-'0')+(num2[end2]-'0') + ans;
            strRet += (sum % 10 + '0');
            ans = sum / 10;
            --end1;
            --end2;
        }

        while(end1 >= 0)
        {
            int sum = ((num1[end1] - '0' + ans));
            strRet += ( (sum%10) + '0');
            ans = sum/10;
            --end1;
        }

        while(end2 >= 0)
        {
            int sum = ((num2[end2] - '0' + ans));
            strRet += ( (sum%10) + '0');
            ans = sum/10;
            --end2;
        }

        if(ans!=0)
        {
            strRet +=( ans + '0');
        }

        reverse(strRet.begin(), strRet.end());
        return strRet;
    }
};

写法2:

class Solution {
public:
    string addStrings(string num1, string num2) 
    {
        int i = num1.length() - 1, j = num2.length() - 1, add = 0;
        string ans = "";
        while (i >= 0 || j >= 0 || add != 0) 
        {
            int x = i >= 0 ? num1[i] - '0' : 0;
            int y = j >= 0 ? num2[j] - '0' : 0;
            int result = x + y + add;
            ans.push_back('0' + result % 10);
            add = result / 10;
            i -= 1;
            j -= 1;
        }
        // 计算完以后的答案需要翻转过来
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

二、字符串相乘

点我直达~

在这里插入图片描述

思路:模拟竖式乘法

字符串相乘的思路与字符串相加的思路类似

  • 1.任意取一个字符串作为被乘数,如果该字符串的长度比另一个字符串短,则需要在不足的位数上补’0’
  • 2.两个字符串从个位开始相乘,所得结果如果大于10,则使用变量ans来保存进位,然后将个位的乘积%10,结果保存到新的字符串strRet中。
  • 3.继续重复2.的过程,在此期间如果任意一个字符串的长度遍历完了, 那么就将另一个字符串的剩余的位数+进位ans复制保存到strRet新的字符串中。这个相加的过程可以调用字符串想加的函数完成。
  • 4.最后逆置strRet字符串即可得到我们想要的结果。

具体代码如下:

class Solution {
public:
    //将其中一个作为被乘数,将每一位拆分出来进行相乘,然后把结果累计起来
    //其中,被乘数的位数如果大于2位,需要先提前加上0
    string multiply(string num1, string num2) 
    {
       string strret;
       if(num2[0] == '0' || num1[0] == '0')
       {
           return strret+='0';
       }
       int end1 = num1.size() -1;
       int end2 = num2.size() -1;

       for(int i = end2;i>=0;--i)
       {
           string cur;
           int add = 0;
           //num2是被乘数,需要补0
           for(int j = end2;j>i;--j)
           {
               cur+='0';
           }

            //开始计算乘积
            for(int j = end1;j>=0;--j)
            {
                int val1 = (num1[j]-'0');
                int val2 = (num2[i]-'0');
                int sum = val1*val2+add;
                cur+=(sum%10 + '0');
                add = sum/10;
            }

            //这里如果进位不等于0,还要把进位加上
            if(add!=0)
            {
                cur+=(add + '0');
            }
            //计算结果需要逆置
            reverse(cur.begin(),cur.end());

            //然后累加起来
            strret = addStrings(strret,cur);
       }
        return strret;
    }

        string addStrings(const string &num1, const string &num2) 
        {
            int i = num1.length() - 1, j = num2.length() - 1, add = 0;
            string ans = "";
            while (i >= 0 || j >= 0 || add != 0) {
                int x = i >= 0 ? num1[i] - '0' : 0;
                int y = j >= 0 ? num2[j] - '0' : 0;
                int result = x + y + add;
                ans.push_back('0' + result % 10);
                add = result / 10;
                i -= 1;
                j -= 1;
        }
        
        // 计算完以后的答案需要翻转过来
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

总结

通过写今天的字符串相加|字符串相乘,我大致学会了如何将字符串转化为竖式的方法进行相加/相乘。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/628972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于枚举常量手误带来的错误

前言 记录2020年5月30日,肯哥在群里面分享的一个因为手误带来的bug。 问题描述 肯哥原话: 又到了每天的open话题讨论时刻,一起在摸鱼中学点东西,今天我们来聊一个话题:一不小心的手误,代码有时能跑&#xf…

Python集合学习笔记

列表、字典、集合都是可变类型的序列. 集合是没有value的字典s {2, 3, 4, 5, 5, 5, 5, 6, 7, 7} print(s) # {2, 3, 4, 5, 6, 7} 集合中没有相同的元素,元素不能重复print() s1 set(range(6)) print(s1) # {0, 1, 2, 3, 4, 5} lis [2, 5, 8, 5, 8, 4, 9] s2 s…

搜索与图论(acwing算法基础)

文章目录 DFS排列数字n皇后 BFS走迷宫 拓扑序列单链表树与图的深度优先搜索模拟队列有向图的拓扑序列 bellman-ford有边数限制的最短路 spfaspfa求最短路spfa判断负环 FloydFloyd求最短路 PrimPrim算法求最小生成树 KruskalKruskal算法求最小生成树 染色法判定二分图染色法判定…

rabbitmq记录(服务器重启后,RabbitMQ用户丢失)

1.docker运行rabbitmq docker run -d --hostname my-rabbit --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq 2.进入rabbitmq容器 docker exec -it 3776394dd2b3 /bin/bash 3.开启rabbitmq可视化界面管理 rabbitmq-plugins enable rabbitmq_management 4.添加新用户…

RabbitMq-高级

参考:https://blog.csdn.net/dingd1234/article/details/125032383 1 TTL TTL QUEUE 声明args TTL MESSAGE postmessage中设置 区别:过期消息会直接删除消息,过期队列若配置死信队列会移到死信队列 ps:同时配置两个已小的为准 2…

2. Redis持久化、主从哨兵架构详解

分布式缓存技术Redis 1. Redis持久化1.1 RDB快照(snapshot)1.1.1 bgsave的写时复制(COW)机制 本文是按照自己的理解进行笔记总结,如有不正确的地方,还望大佬多多指点纠正,勿喷。 课程内容: 1、RDB、AOF及混合持久化详解 2、并行…

css基础一:说说你对CSS盒子模型的理解?

一、是什么 当对一个文档进行布局(layout)的时候,浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型(CSS basic box model),将所有元素表示为一个个矩形的盒子(box) 一个盒子由四…

认识HttpServletRequest和HttpServletResponse

hi,大家好,上一期我们认识了HttpServlet,这一期我们来认识一下HttpServletRequest和HttpServletResponse 🚀HttpServletRequest 💚1.核心方法介绍 💚2.代码举例展示 🚀HttpServletResponse 💚1.核心方法展示 &a…

STC12读取内部ID方法介绍

STC12读取内部ID方法介绍 🔖这里以STC12LE5A60S2为例,从STC12手册的第一章,1.10小结可以找到相关的ID相关的信息。这个信息主要是用于程序加密或产品销售管理等方面。🌿STC12LE5A60S2系统板: https://oshwhub.com/pers…

javaScript蓝桥杯----阅读吧

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 “读万卷书,行万里路”,无论你现在贫穷或富有,身和心一定要有一个在路上。那么,在快节奏的今天,人们是如何利用碎片化的时间去阅读的呢?没错&…

【MySQL高级篇笔记-事务基础知识(中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、数据库事务概述 1、存储引擎支持情况 2、基本概念 3、事务的ACID特性 1.原子性(atomicity) 2.一致性(consistency) 3.隔离型(isolation) 4.持久性&a…

卷积编码和维特比译码

文章目录 卷积编码维特比译码 卷积编码 卷积码是一种非分组码,通常适用于前向纠错。在分组码中,编码器产生的 n 个码元的一个码组,完全决定于这段时间中 k 比特输入信息。这个码组中的监督位仅监督本码组中 k 个信息位。卷积码在编码时虽然也…

Calico介绍

Calico 是一个基于 BGP 的纯三层的网络方案,与 OpenStack 、Kubernetes 、AWS 、GCE 等云平台都能够良好地集成 。 Calico 在每个计算节点都利用 Linux Kernel 实现了一个高效的 vRouter 来负责数据转发 。每个 vRouter 都通过 BGP 协议把在本节点上运行的容器的路由…

msf渗透练习-php后门反弹

说明: 本章内容,仅供学习,不要用于非法用途(做个好白帽) (一)后门反弹是什么 后门反弹是指攻击者在成功入侵一台计算机后,在目标计算机上安装一个“后门程序”,将该程序…

内网安全:横向传递攻击(SMB || WMI 明文或 hash 传递)

内网安全:横向传递攻击. 横向移动就是在拿下对方一台主机后,以拿下的那台主机作为跳板,对内网的其他主机再进行后面渗透,利用既有的资源尝试获取更多的凭据、更高的权限,一步一步拿下更多的主机,进而达到控…

解决语言障碍:如何将Axure变为中文版?

Axure 是一款备受称赞的原型设计工具,被誉为 "交互神器"。然而,在国内,一些设计师对于使用 Axure 有所犹豫,其中语言环境不适应是主要的顾虑之一。在本文中,我们将探讨一种更适合国内设计师的 Axure 中文版即…

网工内推 | 国企专场,补贴福利多,CCNP认证以上优先

01 凯盛数智信息技术科技(上海)有限公司 🔷招聘岗位:网络工程师(IT工程师) 🔷职责描述: 1、负责公司数据中心机房、服务器及网络设备的管理和维护工作; 2、负责公司基础…

微信小程序实用工具——渐变色按钮(二)

今日推荐💁‍♂️ 今年的国美毕业展已经开始了🧑‍🎨🧑‍🎨在杭州的小伙伴可以快速出击了🏃‍♂️🏃‍♂️ 这里我想推荐其中的一副版画作品《突围》 在众多版画系作品中被它所吸引 文章目录 今…

【linux离线升级gcc版本---gcc4.8.5-->gcc12.2.0】

【linux离线升级gcc版本---gcc4.8.5-->gcc12.2.0】 🔻 一、gcc简介🔻 二、gcc下载上传🔻 三、查看和安装gcc-12.2.0需要的依赖3.1 🍁 查看gcc-12.2.0所需依赖库3.2 🍁 安装gmp、mpfr、mpc、isl &#x1f53…

DJ4-8 抖动与工作集

目录 4.8 抖动与工作集 1、缺页率对有效访问时间的影响 2、CPU 利用率急剧下降的原因 3、抖动 4、工作集模型 5、抖动的预防 4.9 请求分段存储管理方式 4.9.1 请求分段中的硬件支持 4.9.2 分段的共享与保护 4.8 抖动与工作集 1、缺页率对有效访问时间的影响 有…