当前位置: 首页 > 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 …...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...