高精度加法及乘法

news2024/10/6 12:25:18

目录

字符串的高精度加法

为什么需要高精度加法?

怎么进行高精度加法?

 链表的高精度加法

翻转链表(带虚拟头节点)

字符串的高精度乘法


字符串的高精度加法

大数加法_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475?tpId=196&tqId=37176&ru=/exam/oj

为什么需要高精度加法?

int 能表示的数的范围为 -2147483648(-2^{31}) ~ 2147483647(2^{31}-1),long long int 能表示的最大数为 2^{63}-1,即使一个数据类型能表示的数字再大,也没办法保存所有的数,在加减乘除的计算上也会有溢出的风险,为了减少溢出的风险,可以用 string 保存数字,再来进行计算。

怎么进行高精度加法?

在日常的加法中,我们让两个加数从右往左,从低位开始对齐,对齐后开始进行加法运算,个位和个位相加,十位和十位相加,如果相加之和大于10,则需要进位,如图所示:

高精度加法就是要模拟平时加法的过程。

假设相加得到的字符串为 ret,按照字符串的存储方式,字符串从左往右,对应数字从高位到低位,所以两个字符串都从后往前遍历,访问一个数字便相加,把相加的结果尾插到 ret 中,模拟每一位对齐后相加。

每一位数相加的结果如果大于等于10,就需要进位,那我们怎么得到进位的值?

我们不能单纯地让每一位数进行相加和尾插,我们需要定义一个变量 tmp ,来存储我们每一位数相加的和,tmp%10 就可以得到 tmp 的个位,即我们要尾插的数,尾插后 tmp/= 10,就可以得到进位的数,进行下一位的相加时,直接把每一位数相加到 tmp 中,便完成了进位操作

在相加时,不可避免会遇到两个数的位数不一样,有的数4位,有的数2位,怎么处理位数不一样的情况?

在每一位相加前,我们需要判断当前的字符串的每一位是否已经相加结束,如果已经相加结束了,就不再访问这个字符串了。

因为我们是把和尾插到 ret 中,所以和也是反的,我们需要把 ret 进行 reverse,就可以得到最终结果。

class Solution {
public:
    string solve(string s, string t) {
        int i=s.size()-1;
        int j=t.size()-1;
        string ret;//两数相加之和
        int tmp=0;//记录每一位相加的和
        while(i>=0 || j>=0 || tmp)
        {
            if(i>=0) tmp+=(s[i--]-'0');//该位不是空,才可以相加
            if(j>=0) tmp+=(t[j--]-'0');

            ret+=(tmp%10+'0');//相加后取模,尾插
            tmp/=10;//除以10,得到的商就是需要进位的数
        }
        reverse(ret.begin(),ret.end());//把字符串逆序
        return ret;
    }
};

 链表的高精度加法

链表相加(二)_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b?tpId=196&tqId=37147&ru=/exam/oj

和字符串的高精度加法一样,我们需要从后面开始访问链表,但是题目提供的链表是单链表,不是双向循环链表,不支持从后向前遍历链表,所以需要自己写一个函数,翻转链表。

翻转链表(带虚拟头节点)

在翻转链表时,我们定义一个虚拟头节点,方便头插

1、没有虚拟头节点时,我们需要判断链表是否为空,不为空则直接头插,为空则需要特殊处理

2、设置了虚拟头节点之后,无论链表是否为空,不需要特殊处理,直接插入到虚拟头节点的后面即可(图中 0 为虚拟头节点)

翻转函数后得到的链表带虚拟头节点,在返回时,不需要返回虚拟头节点(不可以返回不属于原链表的结点),所以需要把虚拟头节点删除

链表翻转后的高精度加法和字符串的高精度加法原理相同。 

class Solution {
public:
    ListNode* reverse(ListNode* head)
    {
        ListNode* newhead=new ListNode(0);//虚拟头节点
        ListNode* cur=head;//遍历head
        while(cur)
        {
            ListNode*next=cur->next;
            cur->next=newhead->next;
            newhead->next=cur;
            cur=next;
        }
        cur=newhead->next;//保存虚拟头节点的下一个结点
        delete newhead;//删除虚拟头节点
        newhead=cur;
        return newhead;//返回翻转后的链表
    }
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        head1=reverse(head1);
        head2=reverse(head2);

        ListNode*cur1=head1;
        ListNode*cur2=head2;
        ListNode* ret=new ListNode(0);//虚拟头节点
        ListNode* end=ret;
        int tmp=0;
        while(cur1 || cur2 ||tmp)
        {
            if(cur1) 
            {
                tmp+=cur1->val;
                cur1=cur1->next;
            }
            if(cur2)
            {
                tmp+=cur2->val;
                cur2=cur2->next;
            }
            ListNode* t=new ListNode(tmp%10);
            end->next=t;
            end=end->next;
            tmp/=10;
        }
        cur1=ret->next;
        delete ret;//删除虚拟头节点
        ret=cur1;
        ret = reverse(ret);//把ret翻转,得到最终结果
        return ret;
    }
};

字符串的高精度乘法

大数乘法_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571?tpId=196&tqId=37177&ru=/exam/oj

关于高精度乘法,有一个很巧妙的方法, 同样也是模拟乘法:

假设现在需要计算 1234 * 24 的积,原本 1234 对应的下标从左往右对应从 1 到 4,翻转后,得到的字符串下标从左往右对应从 4 到 1,24同理,原本 1234 和 24 中 ' 4 ' 的下标是不对齐的,翻转后对齐了,之后我们可以进行相乘。

下标为 i 的数 和下标为 j 的数相乘,相乘的结果放在下标为 i+j 的位置,例如下标为 2 的数 2 和下标为 1 的数 2,相乘的结果 4 应该放在下标为 3 的位置,所有数相乘之后,再把对应位置的数相加并进位,翻转结果字符串即可,如图所示:

但是我们需要处理前导 0 的情况,比如 1000 * 0,得到的字符串为 0000,但我们只需要结果 0,所以我们当字符串的长度大于 1 且字符串的末尾为 0 时,需要尾删 0.

class Solution {
public: 
    string solve(string s, string t) {
       reverse(s.begin(),s.end());//翻转字符串
       reverse(t.begin(),t.end());
       int m=s.size(),n=t.size();
       vector<int> v(m+n);
       for(int i=0;i<m;i++)
       {
            for(int j=0;j<n;j++)
            {
                v[i+j]+=(s[i]-'0')*(t[j]-'0');
            }
       }
       int tmp=0;
       string ret;
       for(int i=0;i<v.size();i++)
       {
            tmp+=v[i];
            ret+=(tmp%10+'0');
            tmp/=10;
       }

        while(ret.size()>1 && ret.back()=='0') ret.pop_back();//处理前导0
        reverse(ret.begin(),ret.end());
       return ret;
    }
};

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

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

相关文章

超详细神仙级Python入门教程,从零基础入门到精通,从看这篇开始

一、初聊Python 1.为什么要学习Python&#xff1f; 在学习Python之前&#xff0c;你不要担心自己没基础或“脑子笨”&#xff0c;我始终认为&#xff0c;只要你想学并为之努力&#xff0c;就能学好&#xff0c;就能用Python去做很多事情。在这个喧嚣的时代&#xff0c;很多技…

数字积分生态:区块链与电商的未来发展之路

大家好&#xff0c;我是微三云周丽&#xff0c;今天给大家分析当下市场比较火爆的商业模式&#xff01; 小编今天跟大伙们分享什么是区块链与电商的完美结合&#xff1f; 区块链技术作为一种去中心化、不可篡改的分布式账本技术&#xff0c;正逐渐渗透到各行各业&#xff0c;给…

yolov5实现人脸检测与性别分类

自建数据集训练人脸检测模型 自建数据集训练人脸性别分类研判模型 使用代码级联两个模型实现静态识别 动态实时识别 python开发语言&#xff0c;pytorch框架&#xff0c;支持一键部署运行

齐护K210系列教程(十一)_显示摄像头图像

显示摄像头图像 因不同的型号在设计的屏显示方向时不同&#xff0c;我们设计程序时可以通过旋转屏幕或摄像头图像的方式来达到正确的显示方向。 型号Q1及掌机前面还有一个RGB灯可以用于摄像头的补光&#xff0c;这样在比较暗的环境下可以开启&#xff0c;让摄像头图像更清晰。…

云计算技术架构及发展

云计算是指一种将可伸缩、弹性、共享的物理和虚拟资源池以按需自服务的方式供应和管理&#xff0c;并提供网络访问的模式。 云计算服务商利用分布式计算和虚拟资源管理等技术&#xff0c;通过网络将分散的ICT资源集中起来形成共享的资源池&#xff0c;并以动态按需和可度量的方…

mysql buffer pool详解

介绍 缓冲池是InnoDB在访问表和索引数据时缓存的主内存区域。缓冲池允许直接从内存访问频繁使用的数据&#xff0c;这加快了处理速度。在专用服务器上&#xff0c;通常会将多达80%的物理内存分配给缓冲池。 为了提高大容量读操作的效率&#xff0c;缓冲池被划分为可能包含多行…

Ubuntu查看端口状态

完蛋了&#xff0c;好像动心了&#xff0c;近一周吃啥东西都索然无味&#xff0c;这可如何是好&#xff01;&#xff01;&#xff01;不知道在期待什么&#xff0c;恐惧与窃喜—— 在Ubuntu系统中&#xff0c;查看某个端口是否被放行&#xff08;即允许流量通过&#xff09;&am…

AI论文速读 |从图结构角度统一车道级交通预测:基准和基线

题目&#xff1a;Unifying Lane-Level Traffic Prediction from a Graph Structural Perspective: Benchmark and Baseline 作者&#xff1a;Shuhao Li, Yue Cui, Jingyi Xu, Libin Li, Lingkai Meng, Weidong Yang(杨卫东), Fan Zhang, Xiaofang Zhou(周晓方) 机构&#xff…

算法提高 第一期 KMP扩展算法

1## 具体思路&#xff1a; 和KMP算法的是想类似&#xff0c;充分利用已经比较字符性质来减少冗余的字符比较次数。KMP的思想是充分的利用模式串中所有前缀字串&#xff08;以模式串为开头的字串&#xff09;的真前缀和真后缀&#xff08;指子串的开始字符与子串的最后字符相等的…

vCenter 物理配置与虚拟机配置对应关系

目录 背景现状概念存储池物理与虚拟资源分配及使用情况汇总 分配cpu内存硬盘VSAN、VM Encryption和VVOL No Requirements厚置备和精简置备 总结cpu内存硬盘建议 背景 现在有三台服务器&#xff0c;需要统计上面所有服务占用的资源情况与总和&#xff0c;目的是看还有多少资源可…

「React Native」为什么要选择 React Native 作为的跨端方案

文章目录 前言一、常见因素二、举个栗子2.1 项目背景2.2 为什么选择 React Native2.3 项目实施2.4 成果总结 前言 没有完美的跨端技术&#xff0c;只有适合的场景。脱离适用场景去谈跨端技术没有什么意义。 一、常见因素 共享代码库&#xff1a; React Native 允许开发者编写…

H264编码标准中游程编码应用介绍

H264编码标准 H.264编码标准&#xff0c;也被称作MPEG-4 AVC&#xff08;Advanced Video Coding&#xff09;&#xff0c;是一种被广泛使用的数字视频压缩标准。它由国际电信联盟&#xff08;ITU-T&#xff09;和国际标准化组织&#xff08;ISO&#xff09;共同开发&#xff0…

Vue3后台管理系统推荐

目录 项目概述 &#x1f35f; 项目展示 功能特点 &#x1f957; 结语 &#x1f4a8; 项目概述 &#x1f35f; 基于Vue 3框架与Element-Plus UI组件库技术精心构建的后端管理模板。该模板系统已成功实现一个基础的权限管理模块&#xff0c;宗旨在于为追求高效二次开发的开发…

The_Maya_Society

突然发现自己做了一些逆向题都没有写笔记 今天&#xff0c;发现这道题有意思 1.解压文件 三个文件The Maya Society.html&#xff0c;maim.cc,maya.png 当时我看到这个题的时候&#xff0c;我以为是不是会是js逆向 看来是我蠢了 这三个文件&#xff0c;main.css和maya.png这两…

<计算机网络自顶向下> 路由器组成

路由器结构概况 路由&#xff1a;运行路由选择算法/协议&#xff08;RIP, OSPF, BGP&#xff09;生成路由表转发&#xff1a;从输入到输出链路交换数据包-根据路由表进行分组的转发中间的fabric是用来接收输入的分组交给输出端口的&#xff0c;完成局部的转发&#xff08;根据…

GPT-SoVITS声音克隆训练和推理(新手教程,附整合包)

环境: Win10 专业版 GPT-SoVITS-0421 整合包 问题描述: GPT-SoVITS声音克隆如何训练和推理教程 解决方案: Zero-shot TTS: Input a 5-second vocal sample and experience instant text-to-speech conversion.零样本 TTS:输入 5 秒的人声样本并体验即时文本到语音转换…

震惊!小红书矩阵账号管理-批量发布笔记

“小红书引流软件矩阵工具-笔记批量发” 昨天&#xff0c;有个粉丝急匆匆地来找我&#xff0c;一脸焦急地说&#xff1a;“大佬&#xff0c;我现在运营着好几个小红书账号&#xff0c;每天都要发布内容&#xff0c;可把我忙坏了&#xff0c;有没有什么高效的管理方法啊&#xf…

1.PROXY-代理内容

SwitchyOmega&#xff0c;浏览器插件&#xff08;edge&#xff0c;火狐插件库都是存在的&#xff09;&#xff0c;安装后的样式 1.安装 2.设置 我们常用的功能&#xff0c;主要是设置一个代理ip访问学习网站入github等&#xff0c;或者docker服务等 3.启动代理 4.验证 https…

Python爬取AppStore脚本获取评论数据Python脚本获取苹果软件评价

Python爬取AppStore脚本获取评论数据Python脚本获取苹果软件评价 效果: # -*- coding: utf-8 -*- import urllib.request import json import xlsxwriter page=1; appid=726029718 workbook = xlsxwriter.Workbook(app评论.xlsx) worksheet = workbook.add_worksheet() forma…

【python】随机模拟——赶火车问题、醉汉回家

问题描述 1.赶火车问题。2.模拟二维随机游动&#xff08;醉汉回家&#xff09; 1.赶火车问题。 一列列车从A站开往B站&#xff0c;某人每天赶往B站上车。他已经了解到火车从A站到B站的运行时间是服从均值为30min&#xff0c;标准差为2min的正态随机变量。火车大约下午13&#…