首页 > 其他分享 >【practise】大数相加、大数相乘

【practise】大数相加、大数相乘

时间:2024-08-03 21:52:57浏览次数:11  
标签:end1 end2 string 大数 int retstr next 相乘 practise

通常,我们的int、long long类型都有最大的数字上限,也就是说再大了会有溢出问题,那么很大的数字是怎么进行运算的呢?

其中一种方法是把很大的数字转变成字符串存放到string中,然后用代码对字符串进行处理,模拟运算的过程来计算出结果的,下面介绍两道关于这方面的典型例题。

1.大数相加

大数相加练习题:LINK
在这里插入图片描述
是这道题目该如何去解答呢???

思路:模拟我们算加法的顺序

  1. 先取每个字符串的最后一个字符
  2. 将字符转变为数字
  3. 然后运算
  4. 然后写到新的字符串上去,如此循环
    图解过程:
    在这里插入图片描述

实际上,这很像我们小学时候手算两个数相加的过程。
于是,我们就可以按照这个思路写出下面这种代码了:

class Solution {
public:
    string addStrings(string num1, string num2) {
        int end1 = num1.size() - 1, end2 = num2.size() - 1;
        int r1 = 0, r2 = 0;
        string retstr;
        int next = 0;
        int ret = 0;
        while(end1 >= 0 || end2 >= 0)
        {
            if(end1 >= 0)
            {
                r1 = num1[end1] - '0';
            }
            else
            {
                r1 = 0;
            }
            // r1 = end1 >= 0 ? num1[end1] = '0' : 0;

            if(end2 >= 0)
            {
                r2 = num2[end2] - '0';
            }
            else
            {
                r2 = 0;
            }
            //r2 = end2 >= 0 ? num2[end2] = '0' : 0;

            ret = (r1 + r2 + next) % 10;
            next = (r1 + r2 + next) / 10;
            retstr.push_back(ret + '0');

            end1--, end2--;
        }

        if(next == 1)
        {
            retstr.push_back('1');
        }

        reverse(retstr.begin(), retstr.end());

        return retstr;
    }
};

上面是一种性能优化代码,按照逻辑,我们每次算出的数字都需要头插的,但是头插的效率比较低,所以换成了尾插,这样到最后颠倒一下字符串的整体顺序就可以了。

2.大数相乘

与之相对的一道题目:大数相乘。
题目链接:LINK
在这里插入图片描述
思路:模拟乘法计算过程
乘法计算操作数只有两个,我们可以看作一个是被乘数另一个是乘数,我们只需要依次取乘数的每个数字与被乘数相乘,然后对每个数字与被乘数相乘的结果加起来就可以得出最终的结果。
在这里插入图片描述

class Solution {
public:
    string addStrings(string num1, string num2) {
        int end1 = num1.size() - 1, end2 = num2.size() - 1;
        int r1 = 0, r2 = 0;
        string retstr;
        int next = 0;
        int ret = 0;
        while (end1 >= 0 || end2 >= 0)
        {
            r1 = end1 >= 0 ? num1[end1] - '0' : 0;
            r2 = end2 >= 0 ? num2[end2] - '0' : 0;

            ret = (r1 + r2 + next) % 10;
            next = (r1 + r2 + next) / 10;
            retstr.push_back(ret + '0');

            end1--, end2--;
        }

        if (next == 1)
        {
            retstr.push_back('1');
        }
        reverse(retstr.begin(), retstr.end());

        return retstr;
    }

    string multiply(string num1, string num2) {
        // 1.特殊情况,乘数有0的情况
        if (num1 == "0" || num2 == "0")
        {
            return "0";
        }

        string ret = "0";
        // 2.一般情况,需要一边乘,一边加
        for (int i = num2.size() - 1; i >= 0; i--)
        {
            // 存储单个字符与一串字符相乘的结果
            string mr;
            // 补零操作
            for (int j = num2.size() - 1; j > i; j--)
            {
                mr.push_back('0');
            }
            // 拿到乘数的单个字符,并转换为数字
            int y = num2[i] - '0';
            // 依次拿到被乘数的字符,并做乘法运算
            int end1 = num1.size() - 1;
            int next = 0;
            while (end1 >= 0)
            {
                int x = num1[end1] - '0';
                int r = x * y + next;
                mr.push_back(r % 10 + '0');
                next = r / 10;

                end1--;
            }
            if (next != 0)
            {
                mr.push_back(next + '0');
            }
            // 逆转
            reverse(mr.begin(), mr.end());
            // 加值
            ret = addStrings(ret, mr);
        }

        return ret;
    }
};

好的,这两道题虽然不难但是比较有意思,可以自己写一下,当然有问题直接看力扣的题解也可以,两个题目的题解写的都很详细,还配有图片,很完美。


EOF

标签:end1,end2,string,大数,int,retstr,next,相乘,practise
From: https://blog.csdn.net/2302_79031646/article/details/140897482

相关文章

  • 大数据
    写程序软件处理用户量和数据量。用户量一大,并发量线程安全问题就会出现。软件一开始是使用C/S的应用架构模式。客户端和服务器端通过互联网相互访问。Windows的客户端软件通过C++编写出来,不同的操作系统支持的客户端软件编写语言不一样。B/S架构模式现很受大众的欢迎,一台......
  • 精品PPT | 微信云原生大数据平台构建及落地实践.pptx
    一、大数据上云概述1.为什么大数据要上云2.微信大数据平台架构演进二、大数据上云基础建设1.统一编排2.Pod设计及大数据配套能力3.计算组件云环境适配三、稳定性及效率提升1.K8S集群稳定性与弹性配额2.可观测性与智能运维......
  • 【大数据开发语言Scala的入门教程】
    ......
  • 18963 最大数字
    这个问题可以使用贪心算法来解决。我们需要定义一个新的比较函数,对于两个数字a和b,如果ab>ba,那么我们就说a大于b。然后我们将所有的数字按照这个新的比较函数进行排序,然后将排序后的数字拼接起来,就可以得到最大的数字。以下是C++代码实现:#include<iostream>#include<vec......
  • 大数据场景下的Zookeeper集群的搭建
    本篇文件将介绍如何搭建zookeeper集群,并集合大数据相关组件介绍zookeeper的功能一、Zookeeper是做什么的,我们搭建它有什么用处Zookeeper是一个分布式的服务管理框架,它负责存储和管理大家都关心的数据,基于观察者涉及模式,Zookeeper接受观察者的注册,一旦这些数据的状态发生了变......
  • 基于SpringBoot的智能购房推荐系统-09040(免费领源码)可做计算机毕业设计JAVA、PHP、爬
    Springboot智能购房推荐系统摘 要近年来随着我国经济的高速发展,房地产业也随之蓬勃发展,尤其是最近国家新出台的房改政策。鼓励居民购房,这对房产公司无疑是一个极好的发展势头。尤为重要的是,近几年随着信息技术和电子商务的快速发展,许多企业都开发了自己房产信息软件。智......
  • 《常见几大数据库》
    常见几大数据库MySQL:你的多功能衣柜MySQL的特点是:Oracle:你的智能图书馆Oracle的特点是:TiDB:你的弹性购物中心TiDB的特点是:OceanBase:你的智慧城市OceanBase的特点是:TDSQL:企业管理专家OceanBase的特点是:自动水平拆分领先的分布式架构不停机弹性扩展强同步复制超高性能......
  • 大数据技术原理-Hbase的安装和应用
    摘要本实验报告详细介绍了在“大数据技术原理”课程中进行的HBase实验。实验环境基于Hadoop生态系统,包括HBase和Java。实验内容涵盖了HBase的安装、版本查询、SSH登录、Hadoop与HBase的启动与关闭,以及通过HBaseShell命令实现数据的基本操作,如表的创建、数据的插入、删除和查......
  • 【IEEE出版 | ICBASE 2020-2023 均已被 EI , Scopus检索 | 温州理工学院、加拿大圭尔
    第五届大数据、人工智能与软件工程国际研讨会(ICBASE2024)将于2024年09月20-22日在中国温州隆重举行。会议主要围绕大数据、人工智能与软件工程等研究领域展开讨论。会议旨在为从事大数据、人工智能与软件工程研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和......
  • 基于Django的超市小程序+47822(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小
    基于django超市小程序摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,超市小程序被用户普遍使用,为方便用户能够可以随时进行超市小程序的数据信息管理,特开发了基于djan......