秒懂百科,C++如此简单丨第十八天:高精度

目录

前言 

模拟运算

高精度加法模版

优化

高精度减法模版

高精度乘法模版

结尾


 必看信息 

▶本篇文章由爱编程的小芒果原创,首发于CSDN,未经许可,严禁转载。

▶本篇文章被收录于秒懂百科,C++如此简单专栏,欢迎订阅。

☆专栏亮点☆

1.每篇文章质量高,质量分保证在80分以上。

2.文章的内容清晰有条理,图文并茂,附有源代码。

3.每个知识点讲解详细,会有很多补充扩展。

4.若哪个知识点没有懂,可以私信我,我会尽可能地帮助你。

前言 

在编程中,我们常常会遇到一些极大的数字。这些数字用long long和double是根本存不下的,所以这节课我们将介绍高精度。

模拟运算

高精度说白了就是模拟运算,首先我们先想一想在生活中我们是怎样计算整数加法的。

12345
+78765
=91110

在计算的过程中,我们会遇到一个特殊情况——进位。

如在计算个位的时候,5+5=10,写0进1,十位4+6+1=11,写1进1。

遇到这种情况该怎么办呢?因为我们知道一个原则“满十进一” ,那么两个数相加在一起一共有多少个整十,是不是就要进几?如8+9=17,有一个整十,所以要进一,以此类推。

而判断一个数由多少个整十最好的方法就是——除法,我们用一个数除以10,得到的就是一个数由几个十组成,注意:这里因为是整数,所以除法是会保留整数,而一个数对10取余不就是余下来的几个一吗?思路知道了,程序也就简单了。

高精度加法模版

#include<bits/stdc++.h>
using namespace std;  
const int N=510; //定义足够大的数组来存储大整数的每一位  
int a[N],b[N],c[N];  
int main() 
{  string str1,str2;  cin>>str1>>str2;// 将字符串逆序存储到数组中,方便从低位到高位进行加法运算  for (int i = 0; i < str1.size(); i++)  a[str1.size() - 1 - i] = str1[i] - '0';  for (int i = 0; i < str2.size(); i++)  b[str2.size() - 1 - i] = str2[i] - '0';  //确定最大长度  int len = max(str1.size(), str2.size());  //进行高精度加法运算  for (int i = 0; i < len; i++) {  c[i] += a[i] + b[i];  c[i + 1] += c[i] / 10; //进位  c[i] %= 10; //取当前位的值  }  //处理最高位的进位  if (c[len] > 0) {  len++; //如果最高位有进位,则长度加1  }  //逆序输出结果  for (int i = len - 1; i >= 0; i--) {  cout << c[i];  }  return 0;  
}

优化

因为我们知道两个数相加最多是18(9+9),那么进位最多是1,所以进位也可以写成这样。

for (int i = 0; i < len; i++) 
{  c[i] += a[i] + b[i];  if(c[i]>=10) {c[i]-=10;c[i+1]+=1;} 
}  

高精度减法模版

高精度减法只需要把“进位”修改成“退位”即可。但需要注意以下几点:

1.判断正负数,如果A<B需要先输出一个负号,并交换A和B。

2.需要借位,千万不要写成进位了。

3.前导零可能不止一个,不要用if,用while循环。

4.如果答案为0,记得额外输出一个0。

#include<bits/stdc++.h>  
using namespace std;  
const int N=510;  
int a[N],b[N],c[N];  
int main() 
{  string str1, str2;  cin >> str1 >> str2;  // 确保str1 >= str2,这里不处理str1 < str2的情况  if (str1.size() < str2.size() || (str1.size() == str2.size() && str1 < str2)) {  cout << "-" << endl; // 输出负号,实际应用中需要更完整的处理  swap(str1, str2); // 交换两个字符串,使得str1始终为较大的数  }  // 将字符串逆序存储到数组中  for (int i = 0; i < str1.size(); i++) a[str1.size() - 1 - i] = str1[i] - '0';  for (int i = 0; i < str2.size(); i++) b[str2.size() - 1 - i] = str2[i] - '0';  int len = max(str1.size(), str2.size());  for (int i = 0; i < len; i++) {  if (a[i] < b[i]) { // 需要借位  a[i + 1]--; // 从高位借1  a[i] += 10; // 当前位加10  }  c[i] = a[i] - b[i]; // 进行减法运算  }  // 跳过前导零  int start = len - 1;  while (start >= 0 && c[start] == 0) {  start--;  }  // 输出结果  if (start >= 0) {  for (int i = start; i >= 0; i--) {  cout << c[i];  }  } else {  cout << "0"; // 如果结果为0,则输出0  }  return 0;  
}

高精度乘法模版

注意以下几点:
1.乘法的每一数位都要和另一个数的每一数位相乘。

2.注意数组c不要开太小了。

#include<bits/stdc++.h>  
using namespace std;  
const int N=510; // 数组大小,用于存储大整数的每一位  
int a[N],b[N],c[N*2]; // c数组的大小为2*N,因为两个N位数相乘的结果可能接近2N位  
int main() 
{  string str1, str2;  cin >> str1 >> str2;  // 将字符串逆序存储到数组中,方便从低位到高位进行计算  for (int i = 0; i < str1.size(); i++) a[str1.size() - 1 - i] = str1[i] - '0';  for (int i = 0; i < str2.size(); i++) b[str2.size() - 1 - i] = str2[i] - '0';  // 高精度乘法  memset(c, 0, sizeof(c)); // 初始化c数组为0  for (int i = 0; i < str1.size(); i++) {  for (int j = 0; j < str2.size(); j++) {  c[i + j] += a[i] * b[j]; // 计算乘积并加到对应位置  c[i + j + 1] += c[i + j] / 10; // 处理进位  c[i + j] %= 10; // 取当前位的值  }  }  // 跳过前导零  int start = str1.size() + str2.size() - 1;  while (start >= 0 && c[start] == 0) {  start--;  }  // 输出结果  if (start >= 0) {  for (int i = start; i >= 0; i--) {  cout << c[i];  }  } else {  cout << "0"; // 如果结果为0,则输出0  }  return 0;  
}

结尾

本节课我们一起学习了高精度,还有高精度除法没有写,留给你自己写一写吧。

如果你觉得还不错的话,记得点赞收藏评论哦,下课!

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

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

相关文章

力扣1122. 数组的相对排序(哈希表)

Problem: 1122. 数组的相对排序 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.利用arr2创建一个无序映射&#xff08;map集合&#xff09;&#xff0c;以其中的元素作为键&#xff0c;值默认设置为0&#xff1b; 2.扫描arr1数组统计arr2元素在其中的个数(将个…

单调队列优化DP问题

目录 1.滑动窗口 2.最大子序和 3.旅行问题 4.烽火传递 5.绿色通道 6.修剪草坪 7.理想的正方形 1.滑动窗口 154.给定一个大小为 n≤106 的数组。 有一个大小为 k 的滑动窗口&#xff0c;它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向…

PyTorch detach():深入解析与实战应用

PyTorch detach()&#xff1a;深入解析与实战应用 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;一、计算图与梯度传播&#x1f333;&#x1f333;二、detach()函数的作用&#x1f333;&#x1f333;三、detach()与requires_grad&#x1f3…

游泳时可以听歌的耳机有哪些?戴游泳耳机有哪些好处?

游泳和跑步在某种程度上相似&#xff0c;特别是在短距离冲刺时&#xff0c;大脑似乎变得空白&#xff0c;而在中长距离的有氧运动中&#xff0c;身体感到疲劳&#xff0c;但大脑却异常清晰&#xff0c;时间却显得格外漫长。如何打发时间&#xff0c;让游泳锻炼变得不无聊&#…

力扣面试题 16.21. 交换和(哈希表)

Problem: 面试题 16.21. 交换和 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.分别求取array1与array2数组每一个元素的和&#xff08;sum1与sum2&#xff09;并同时将array2的元素存入一个set集合中&#xff1b; 2.如果sum1和sum2的和为奇数&#xff0c;则不…

使用 Windows 11/10 上的最佳 PDF 转 Word 转换器释放 PDF 的潜力

毫无疑问&#xff0c;PDF 是最好的文档格式之一&#xff0c;但就像其他格式一样&#xff0c;有时它们确实会带来一些限制。例如&#xff0c;在某些情况下&#xff0c;您可能想要将 PDF 转换为 Word。在这种情况下&#xff0c;您始终可以借助 PDF 到 Word 转换器的帮助。 为了说…

Java实现软件学院思政案例库系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理员2.2 普通教师 三、系统展示四、核心代码4.1 查询思政案例4.2 审核思政案例4.3 查询思政课程4.4 思政案例点赞4.5 新增思政案例评语 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的软件学…

谁再用Arrays.asList就开除谁

谁再用Arrays.asList就开除谁 hi&#xff0c;我是achang&#xff0c;今天说一个使用Arrays.asList后对应出现的一系列坑&#xff0c;因为他有那么多坑&#xff0c;所以会有开玩笑的说&#xff1a;谁再用Arrays.asList就开除谁 那Arrays.asList的作用很简单&#xff0c;就是把…

86.分布式锁理论分析

文章目录 前言一、为什么需要分布式锁&#xff1f;二、基于 Redis 分布式锁怎么实现&#xff1f;三、Redis 分布锁存在的问题3.1 死锁问题3.2 锁过期时间问题3.3 锁被别人释放问题 四、Redis 分布锁小结五、Redis 主从同步对分布式锁的影响六、Redlock 方案七、Redlock 的争论7…

autojs通过正则表达式获取带有数字的text内容

var ctextMatches(/\d/).findOne()console.log("当前金币"c.text()) // 获取当前金币UiSelector.textMatches(reg) reg {string} | {Regex} 要满足的正则表达式。 为当前选择器附加控件"text需要满足正则表达式reg"的条件。 有关正则表达式&#xff0c;可…

揭秘外观模式:简化复杂系统的关键设计策略

前言 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它隐藏了系统的复杂性&#xff0c;并向客户端提供了一个可以访问系统的接口。这种类型的设计模式向现有的系统添加一个接口&#xff0c;来隐藏系统的复杂性。这种模式涉及到一个单一的类…

【C语言】实现单链表

目录 &#xff08;一&#xff09;头文件 &#xff08;二&#xff09;功能实现 &#xff08;1&#xff09;打印单链表 &#xff08;2&#xff09;头插与头删 &#xff08;3&#xff09;尾插与尾删 &#xff08;4&#xff09; 删除指定位置节点 和 删除指定位置之后的节点 …

k8s搭建容器云平台

平台部署–部署容器云平台 部署kubernets 1.22.1集群 curl -O http://...../chinaskills_cloud_paas_v2.0.2.iso mount chinaskills_cloud_paas_v2.0.2.iso /mnt cp -rvf /mnt/* /opt cp /opt/kubeeasy /usr/bin kubeeasy --help#[install dependencies package cluster]kube…

什么是依赖注入?如何在Spring中配置和使用依赖注入?

什么是依赖注入&#xff1f; 依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;是一种设计模式&#xff0c;它通过将对象之间的依赖关系的创建和维护转移到外部容器中来&#xff0c;以减少对象之间的紧耦合性并提高可重用性。在传统的程序设计中&#xff0c…

蓝桥杯嵌入式第9届真题(完成) STM32G431

蓝桥杯嵌入式第9届真题(完成) STM32G431 题目 分析和代码 main.h /* USER CODE BEGIN Header */ /********************************************************************************* file : main.h* brief : Header for main.c file.* …

[ai笔记4] 将AI工具场景化,应用于生活和工作

欢迎来到文思源想的AI空间&#xff0c;这是技术老兵重学ai以及成长思考的第4篇分享内容&#xff01; 转眼已经到了大年初三&#xff0c;但是拜年的任务还只完成了一半&#xff0c;准备的大部头的书&#xff0c;现在也就看了两本&#xff0c;还好AI笔记通过每天早起坚持了下来。…

Java-并发高频面试题-2

接着之前的Java-并发高频面试题 7. synchronized的实现原理是怎么样的&#xff1f; 首先我们要知道synchronized它是解决线程安全问题的一种方式&#xff0c;而具体是怎么解决的呢&#xff1f;主要是通过加锁的方式来解决 在底层实现上来看 是通过 monitorenter、monitorexit…

java实战:基于Redis的ZSet实现秒级排行榜

本文将介绍如何使用Redis的ZSet&#xff08;有序集合&#xff09;来实现一个秒级排行榜。展示如何使用Java和Jedis库来创建、更新和获取排行榜数据。通过本文&#xff0c;可以了解到如何在Java应用程序中使用Redis的ZSet来实现一个高性能的秒级排行榜。 一、ZSet概述 Redis的…

【Spring原理进阶】SpringMVC调用链+JSP模板应用讲解

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

【Python网络编程之Ping命令的实现】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python开发技术 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python网络编程之Ping命令的实现 代码见资源&#xff0c;效果图如下一、实验要求二、协议原理2…