当前位置: 首页 > news >正文

【算法】高精度

作者:指针不指南吗
专栏:算法篇

🐾不能只会思路,必须落实到代码上🐾

文章目录

  • 前言
  • 一、高精度加法
  • 二、高精度减法
  • 三、高精度乘法
  • 四、高精度除法

前言

​ 高精度即很大很大的数,超过了 long long 的范围,不能直接读取进行运算,需要用 string 读入,然后存储在数组中去。

​ 高精度算法即把每一位上的数单独拿出来,分别计算,再跟每一位之间的关系,再研究,最后结果仍然存在数组中并输出。


一、高精度加法

  1. 思路

    • 大整数的存储
      • 使用 vector 存储,a[0] 存储个位,依次往后最后存储最高位
    • 代码思想
      • 从个位数开始依次,让a,b每一位相加,结果取模存在结果数组C中,t 表示进位
      • 每次两个数a,b的各个位相加再加上进位t
      • 直到加到最高位
  2. 模板

    #include<bits/stdc++.h>
    using namespace std;//C=A+B
    vector<int> add(vector<int> &A,vector<int> &B)//引用减少时间,不使用引用即把原数据copy一遍,费时间 
    {vector<int> C;  //定义一个结果答案if(A.size()<B.size()) return add(B,A);int t=0;   //t表示进位,个位开始,无需+进位,即t=0 for(int i=0;i<A.size();i++){   t+=A[i];if(i<B.size()) t+=B[i];  //各个位上的数 和 进位 相加 C.push_back(t%10);  t/=10;  //求进位 } if(t) C.push_back(1);  //离开循环时,t没有加 return C;
    }int main()
    {string a,b;vector<int> A,B;cin>>a>>b;  //输入123456//存储大整数  倒着存储 for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');   //存储 6,5,4,3,2,1for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');   //注意这里是字符串的长度aauto C=add(A,B);for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);  //注意 倒序输出return 0;
    }
    

二、高精度减法

  1. 思路

    • 大整数的存储
    • 核心思想
      • 确保是大数减小数,首先从个位开始作差,取模存储在C中,t 表示借位(这里很巧妙具体看下面的代码
      • 每次各个位上的数作差 - 借位 t ,取模存起来,有借位 t=1,没有t=0;
      • 直到 大整数.size( ) 去前导0
  2. 模板

    #include<bits/stdc++.h>
    using namespace std;//判断两个大整数的大小 
    bool cmp(vector<int> &A,vector<int> &B){  if(A.size()!=B.size()) return A.size()>B.size();  //位数不同时 if(A.size()==B.size())   //位数相同时 for(int i=0;i<A.size();i++)if(A[i]!=B[i]) return A[i]>B[i];
    }//C=A-B
    vector<int> sub(vector<int> &A,vector<int> &B)
    {if(!cmp(A,B)) {cout<<'-';    //如果小减去大数:注意加个 - 负号 return sub(B,A);  //交换 }vector<int> C;int t=0;  //t表示借位 for(int i=0;i<A.size();i++){t=A[i]-t;  //各个位上的数,先减去借位if(i<B.size()) t-=B[i];    //B还有数的话,减去B[i];C.push_back((t+10)%10);  //巧妙:不用分情况,正负数一块取成正的if(t<0) t=1;  //判断是否借位 else t=0;}while(C.size()>1&&C.back()==0) C.pop_back();  //去掉前导0 如003 return C;
    }int main()
    {string a,b;vector<int> A,B;cin>>a>>b;    //大整数的存储for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');auto C=sub(A,B);for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);return 0;} 
    

三、高精度乘法

高精度乘法一般是 一个大整数乘一个比较小的数

  1. 思路

    • 大整数的存储

    • 核心思想

      • 小的数b不拆,让b依次和大数A的每一位相乘从A的个位开始,t表示进位;
      • 对每次计算A[i]*b+t的结果取模,存在结果数组中,借位除10即可,t可以任意大,比如可以进位22
      • 直到 大数的最高位&&t==0去掉前导0
    1. 模板
    #include<bits/stdc++.h>
    using namespace std;//C=A*b
    vector<int> mul(vector<int> &A,int b)
    {vector<int> C;int t=0;  //t表示进位for(int i=0;i<A.size()||t;i++){   //两个条件都满足才能退出来,否则没有计算完t=A[i]*b+t;   //A的每一位与b相乘加上进位C.push_back(t%10);   //对计算结果取模,存在结果数组中t/=10;  }while(C.size()>1&&C.back()==0) C.pop_back();  //去掉前导0return C;
    }int main()
    {string a;int b;   // 小的数用int 来存就OKvector<int> A;cin>>a>>b;for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');auto C=mul(A,b);for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);return 0;} 
    

四、高精度除法

高精度除法一般是一个大的整数除以一个小的整数

  1. 思路

    • 大整数的存储
    • 核心思想
      • 从最高位开始,最高位除以除数,余数r剩下;
      • r*10+大整数的下一位,再除以除数,余数r剩下;
      • 重复,直到个位去掉前导0
  2. 模板

#include<bits/stdc++.h>
using namespace std;//A➗b=C...r
vector<int> div(vector<int> &A,int b,int &r)
{vector<int> C;r=0;  //r表示余数for(int i=A.size()-1;i>=0;i--){r=r*10+A[i];  //新的除数C.push_back(r/b);   //把商存下来r%=b;  //取余数
}reverse(C.begin(),C.end());   //反正问题,现在虽然是正序,但是与其他运算保持一致,输出的反序,所以现在反过来,负负得正while(C.size()>1&&C.back()==0) C.pop_back();  //去掉前导0return C;
}int main()
{string a;int b;vector<int> A;cin>>a>>b;for(int i=a.size()-1;i>=0;i--)  A.push_back(a[i]-'0');int r;   //除法多个一个余数auto C=div(A,b,r);for(int i=C.size()-1;i>=0;i--)  printf("%d",C[i]);printf("\n");printf("%d",r);return 0;}

相关文章:

【算法】高精度

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;不能只会思路&#xff0c;必须落实到代码上&#x1f43e; 文章目录前言一、高精度加法二、高精度减法三、高精度乘法四、高精度除法前言 ​ 高精度即很大很大的数&#xff0c;超过了 long long 的范围&…...

计算机网络-基本概念

目录 计算机网络-基本概念 互联网 Java的跨平台原理 ​编辑 C\C的跨平台原理 解释性语言的跨平台原理(python,js等) 客户端 vs 服务器 什么是协议&#xff1f; 网络互连模型 请求过程 计算机之间的通信基础 计算机之间的连接方式-网线直连(需要用交叉线&#xff0c;而…...

你评论,我赠书~【哈士奇赠书 - 13期】-〖Python程序设计-编程基础、Web开发及数据分析〗参与评论,即可有机获得

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…...

【设计模式】我终于读懂了代理模式。。。

&#x1f466;代理模式的基本介绍 1)代理模式&#xff1a;为一个对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 2)被代理的对象可以是远程对象、创建…...

每天10个前端小知识 【Day 2】

&#x1f469; 个人主页&#xff1a;不爱吃糖的程序媛 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域新星创作者、CSDN内容合伙人&#xff0c;专注于前端各领域技术&#xff0c;成长的路上共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨系列专栏&#xff1a;前端…...

帮助中心在线制作工具推荐这4款,很不错哟!

根据用户咨询问题是否解决的情景&#xff0c;分为三个部分&#xff0c;首先帮助中心恰好有用户需要咨询的问题&#xff0c;用户可以通过点击相关问题即可解决自己的问题&#xff0c;其次&#xff0c;用户第一眼没有在帮助中心解决问题&#xff0c;有个搜索框&#xff0c;用户的…...

rabbitMQ相关文章汇总

RabbitMQ五种工作模式&#xff1a; https://blog.csdn.net/weixin_41882200/article/details/117128590?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167625223516800182771874%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id1…...

【C++】异常

&#x1f308;欢迎来到C专栏~~异常 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&#x1…...

@Validated注解不生效问题汇总

Validated注解不生效问题汇总 文章目录Validated注解不生效问题汇总背景&#xff1a;一&#xff1a;可能原因原因1&#xff1a;原因2&#xff1a;原因3&#xff1a;原因4&#xff1a;二&#xff1a;补充全局异常对validation的处理背景&#xff1a; 项目框架应用的是validatio…...

华科万维C++章节练习2_4

题目&#xff1a;编写程序&#xff0c;从键盘输入一个字符&#xff0c;然后在屏幕上输出该字符开头的连续3个字符以及对应ASCII码。 输出格式请参看&#xff1a; 请输入一个字符>>A 字符 ASCII码 A 65 B 66 C 67 请按任意键继续. . . 请直接…...

17万字数字化医院信息化建设大数据平台建设方案WORD

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目录 第1章 医院信息化概述 1.…...

Android 11系统签名修改

Android OS 映像在两个地方使用加密签名&#xff1a;映像中的所有 .apk 文件都必须经过签名。Android 软件包管理器通过下列两种方式使用 .apk 签名&#xff1a;更换应用时&#xff0c;必须使用与旧应用相同的密钥对其签名&#xff0c;才能存取旧应用的数据。无论是通过覆盖 .a…...

亚马逊、沃尔玛卖家自养号退款经验和测评技术

今天给大家介绍下在做亚马逊、沃尔玛退款自养号中的经验&#xff0c;众所周知&#xff0c;自养号最重要的是养号的环境&#xff0c;包括系统的纯净度&#xff0c;下单的信用卡以及其他的一些细节。 环境系统市面上有很多&#xff0c;鱼龙混杂&#xff0c;比如什么lumi&#xf…...

Spring Security in Action 第十一章 SpringSecurity前后端分离实战

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;以实战为线索&#xff0c;逐步深入SpringSecurity相关知识相关知识&#xff0c;打造完整的SpringSecurity学习步骤&#xff0c;提升工程化编码能力和思维能力&#xff0c;写出高质量代码。希望大家都能够从中有所收获&#…...

高级前端二面vue面试题(持续更新中)

action 与 mutation 的区别 mutation 是同步更新&#xff0c; $watch 严格模式下会报错 action 是异步操作&#xff0c;可以获取数据后调用 mutation 提交最终数据 MVVM的优缺点? 优点: 分离视图&#xff08;View&#xff09;和模型&#xff08;Model&#xff09;&#xff…...

七大设计原则之依赖倒置原则应用

目录1 依赖倒置原则2 依赖倒置应用1 依赖倒置原则 依赖倒置原则&#xff08;Dependence Inversion Principle,DIP&#xff09;是指设计代码结构时&#xff0c;高层模块不应该依赖底层模块&#xff0c;二者都应该依赖其抽象。抽象不应该依赖细节&#xff1b;细节应该依赖抽象。…...

Dubbo面试题2023

1、为什么要用Dubbo 随着服务化的进一步发展&#xff0c;服务越来越多&#xff0c;服务之间的调用和依赖关系也越来越复杂&#xff0c;诞生了面向服务 的架构体系(SOA)&#xff0c;也因此衍生出了一系列相应的技术&#xff0c;如对服务提供、服务调用、连接处理、通信协议、 …...

Swift(5)

目录 集合类型 数组 ​编辑 合集 合集操作 字典 Where 集合类型 Swift提供了三种主要的集合类型&#xff1a;组合&#xff0c;合集&#xff0c;字典。 数组是有序的值的集合。 合集是唯一值的无序集合。 字典是无序的键值对集合。 数组 Swift数组的类型的完整写法是…...

[Java 进阶面试题] CAS 和 Synchronized 优化过程

最有用的东西,是你手里的钱,有钱就有底气,还不快去挣钱~ 文章目录CAS 和 Synchronized 优化过程1. CAS1.1 CAS的原理1.2 CAS实现自增自减的原子性1.3 CAS实现自旋锁1.4 CAS针对ABA问题的优化2. synchronized2.1 synchronized加锁阶段分析2.2 synchronized优化CAS 和 Synchroniz…...

算法思想 - 贪心算法

本文主要介绍算法中贪心算法的思想: 保证每次操作都是局部最优的&#xff0c;并且最后得到的结果是全局最优的。贪心思想相关题目分配饼干455. Assign Cookies (Easy)Input: [1,2], [1,2,3] Output: 2Explanation: You have 2 children and 3 cookies. The greed factors of 2 …...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...