完整教程:ACWing08:高精度专题

news/2025/10/25 22:12:47/文章来源:https://www.cnblogs.com/lxjshuju/p/19166048

以下纯属是自己学习csp过程中的一些记录,方便自己后续复盘,随心写,不必当真。

题目791:高精度加法

算法思想:


        什么是高精度?         A.length<<10e6 ,a<<10e9 

然后在这个情况下进行加减乘除如 A+B、A-B、A*b、A/b等的组合就是高精度运算。

我们普通的加法手算如下

例如计算:567 + 28

先个位相加: 7 + 8 = 15,所以结果的个位是5,向十位进 1

再十位相加: 6 + 2 + 1(进位)= 9, 所以十位是 9,向百位进 0

再百位相加: 5 + 0 = 5, 所以结果的百位是 5

综上,计算结果为 595

算法计算思路:

计算 567 + 28

用 a, b 两个字符串存储输入。a = 567, b = 28

为了方便计算,(因为加法要从各位开始,倒序存放符合计算规律)将两个数分别 倒序 存放在 A, B 两个整数数组中。 A = [7, 6, 5], B = [8, 2]

新建整数数组 res保存结果,整型变量 c保存进位,初始 c= 0.

将各个位上的数字相加,求出结果对应位上的数字和进位。

例如对个位计算: A[0] + B[0] = 7 + 8 = 15, 结果个位上是 5,进位是 1. 所以 res[0] = 5, 进位 c = 1

最后把结果数组 res 中就保存了计算倒序结果,倒序输出就是答案。

代码实现:O(n+m)

// 高精度加法
#include 
#include 
using namespace std;
vector add(vector &a, vector &b)
{// c为进位int c = 0;vector res;// 如果数组a和b有没遍历完的,进行循环for (int i = 0; i < a.size() || i < b.size(); i++){// 没遍历完的,加到进位中 此时c=a[i]+b[i]+cif (i < a.size())c += a[i];if (i < b.size())c += b[i];// 结果只需要保存c对10的模res.push_back(c % 10);// c变为c/10 进位为1下次循环加c /= 10;}// 如果数组全部遍历完,还需要考虑最高位是否有进位,若有则最高位+1if (c)res.push_back(1);return res;
}
int main()
{string n, m;cin >> n >> m;vector a, b;// a,b都为字符串,可以遍历,将每个字符转为int 存入数组 为后续加法做准备for (int i = n.size() - 1; i >= 0; i--)a.push_back(n[i] - '0');for (int i = m.size() - 1; i >= 0; i--)b.push_back(m[i] - '0');auto c = add(a, b);// 输出结果for (int i = c.size() - 1; i >= 0; i--)cout << c[i];return 0;
}

题目792:高精度减法

算法思想:

和高精度+法差不多,值得注意的是:
1、减法的借位处理,不管借不借位,都可以把(t+10)%10加进数组!
2、相减为负数的处理:先进行判断大小,保证减法都是大减小,最后考虑符号问题。
3、前导0的处理

代码实现:O(n)

#include 
#include 
#include 
using namespace std;
// 判断a>=b
bool cmp(vector &a, vector &b)
{// a,b长度不一,长的大if (a.size() != b.size())return a.size() > b.size();// 长度相等 逐位比较 最高位在最后面所以反着比for (int i = a.size() - 1; i >= 0; i--)if (a[i] != b[i]) return a[i] > b[i];// 相等返回truereturn true;
}
vector sub(vector &a, vector &b)
{vector res;int t = 0;// 减法从个位开始for (int i = 0; i < a.size(); i++){// t=0则 t=a[i]  t=1则t=a[i]-1t = a[i] - t;// 如果被减数还有位数if (i < b.size())// t减去被减数t -= b[i];// t<0则t=10+t 借位  t>=0则t=t 不借位res.push_back((t + 10) % 10);// 借位则t=1 否则t=0if (t < 0) t = 1;else t = 0;}// 去除多余的0   003=3while (res.size() > 1 && res.back() == 0) res.pop_back();return res;
}int main(){string n, m;cin >> n >> m;vector a, b;//反向读取字符串for (int i = n.size() - 1; i >= 0; i--)a.push_back(n[i] - '0');for (int i = m.size() - 1; i >= 0; i--)b.push_back(m[i] - '0');// 调用函数比大小if (cmp(a, b)){auto c = sub(a, b);for (int i = c.size() - 1; i >= 0; i--)cout << c[i];}else{auto c = sub(b, a);//带上-号cout<<"-";for (int i = c.size() - 1; i >= 0; i--)cout << c[i];}return 0;}

题目793:高精度乘法

算法思想:

和高精度+-法差不多,值得注意的是:
1、乘法的进位处理
2、特殊判断,如果×0的话,直接输出结果
3、注意最高位,最后一次乘完要判断t的大小,为1说明最高位有进位,手动添加进数组即可。

代码实现:O(n)

#include
#include
#include
using namespace std;
//高精度乘法
vector mul(vector& a,int b){vector res;//进位int t=0;//如果b为0,则结果为0 不必进行乘法运算if(b==0) {res.push_back(0);return res;}//每一位都与b相乘for(int i=0;i>a>>b;vector A;//逆序存入数组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--) cout<

题目794:高精度除法

算法思想:

和高精度+-×法差不多,值得注意的是:
1、除法比较特殊,需要从最高位开始除数,所以for循环倒序,因为最后一位存的是最高位。
2、因为除法存在第一位是0的情况,所以要去除前导0。
3、不懂得友友可以自己手算模拟一下!很清晰!

代码实现:O(n)

#include 
#include 
#include 
#include 
using namespace std;
vector div(vector &a, int b, int &r)
{vector res;// 除法需要从最高位开始算for (int i = a.size() - 1; i >= 0; i--){// 余数操作r = r * 10 + a[i];// 存入商res.push_back(r / b);// 更新余数r = r % b;}// 反转数组 去除多余的前导0  因为除法第一个数一定是0reverse(res.begin(), res.end());while (res.size() > 1 && res.back() == 0)res.pop_back();return res;
}
int main()
{string a;int b;cin >> a >> b;vector A;// 反转存入数组for (int i = a.size() - 1; i >= 0; i--)A.push_back(a[i] - '0');// 余数int r = 0;auto c = div(A, b, r);for (int i = c.size() - 1; i >= 0; i--)cout << c[i];cout << endl<< r << endl;return 0;
}

欢迎友友评论区讨论,有不足请指出,大家一起交流进步!

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

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

相关文章

2025.10.25总结

过完软考的理论部分,接下来有题型讲解和刷题部分,看视频的话还需要10h+,除此之外还需要练整套题型,上午题和下午题都要练。

ABC429

恍惚间已经好久没写 ABC 了。 最好的一次,rk300,\(6\) 题 \(2\) 罚时。 A - Too Many Requests 模拟即可,时间复杂度为 \(O(n)\)。点击查看代码 #include <iostream> #include <cstdio> using namespac…

使用本地git命令行拉取github.com软件仓库public项目

使用本地git命令行拉取github.com软件仓库public项目2025-10-25 22:10 flyfish163 阅读(0) 评论(0) 收藏 举报1、本地机器安装git客户端 对于windows机器来说,下载一个Git exe安装即可,如Git-2.49.0-64-bit.exe …

10.25 CSP-S模拟39/2025多校冲刺CSP模拟赛8 改题记录

HZOJ 写在前面 信心场?终于踩线300pts了(虽然重测后差了点)。我竟然还有今天,场切3道。虽然有数据水的原因但是那只有T3。然后现在的状态是饿饿饿饿饿饿,不知道干啥,遂先把这个写了。《Lullaby》祝今夜好梦 기다…

MySQL-主从复制 - 指南

MySQL-主从复制 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &quo…

嵌入子流形

嵌入子流形 嵌入子流形的定义 由于在流形优化中,一般考虑在有限维线性空间上的流形,因此如未加特殊申明,以下所考虑的流形都是指有限维线性空间 \(\mathbb{R}^n\) 的流形,且是光滑流形。 这一节考虑嵌入子流形,这…

玩转单片机之智能车小露——数字与字符串的转换与打印

在 玩转单片机之智能车小露——通过UART为单片机增加TTY终端 中我们在TTYEchoNumber中使用 printf 函数将数字输出到串口。其实数字很多时候都不是以数的形式表示的,几乎所有的输入和显示环节数字都是以字符串的形式来…

数据采集作业1 102302111 海米沙

作业一 1)用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息的实验 输出信息: 排名 学校名称 省市 学校类型 总分 …

ABC429(C,D,E)

C 思路:容斥原理 开桶统计元素个数 求$ A_i,A_j,A_k (i \lt j \lt k)$ 其中两个相等的元组数量: 若\(A_i\)有\(k\)个\(A_i\)和其他一个相等:\(ans = (k-1) \times (n-i-(k-1))\) 其他两个相等:先算出所有两两相等的…

列表,集合,字典的增、删、查、改方法对比

在Python中,列表(List)、集合(Set)和字典(Dict)是三种常用的数据结构,它们在增、删、查、改操作上各有特点。以下是它们的详细对比:1. 列表(List) 列表是有序的可变序列,支持重复元素。操作 方法 示例 说明…

linux磁盘管理-RAID介绍 - 详解

linux磁盘管理-RAID介绍 - 详解2025-10-25 21:54 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

详细介绍:语义网络(Semantic Net)对人工智能中自然语言处理的深层语义分析的影响与启示

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2023.2.24 操作系统期末考试回忆 山科 山东科技大学

5个简答题 1个6分30分操作系统的四个基本特征是什么?最基本特征是什么比较说明进程和程序的区别有哪些?列举几个操作系统中的时间换空间 空间换时间的例子SPOOLing 的组成,工作过程,以共享打印机为例某文件系统为一…

线段上随机取n个点的最大距离期望

Problem 在长为 $ a $ 的线段上独立地选取 $ n $ 个点($ n \geq 2 $),记相距最远的两点的距离为 $ X $,求 $ E(X) $。方法一:定义求解 记 $ A $ 为 $ X = t \(,\) B $ 为剩余 $ n-2 $ 个点在最远的两点间,则有 …

MusicFree 音乐

MusicFree是由大佬猫头猫开发的一款免费、开源的本地音乐播放器,同时支持Android、Windows、MacOS、Linux这几个客户端,很强大!MusicFree安装后就是一个纯粹的本地音乐播放器,但可以通过配置「插件」地址实现定制化…

P10老板一句‘搞不定就P0’,15分钟我用Arthas捞回1000万资损 - 指南

P10老板一句‘搞不定就P0’,15分钟我用Arthas捞回1000万资损 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

RuoYi-Cloud-Plus 数据权限实现原理解析

RuoYi-Cloud-Plus 数据权限实现原理解析 什么是数据权限? 数据权限是控制用户能够访问哪些数据的权限机制。在实际业务场景中,我们经常遇到这样的需求:普通员工只能查看自己创建的数据 部门经理可以查看本部门所有员…

详细介绍:JavaScript学习笔记(十五):ES6模板字符串使用指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Python毕业设计实例-基于python养老社区的查询预约架构(源码+LW+部署文档+全bao+远程调试+代码讲解等)

Python毕业设计实例-基于python养老社区的查询预约架构(源码+LW+部署文档+全bao+远程调试+代码讲解等)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: blo…

第5天(中等题 滑动窗口、逆向思维)

打卡第五天 两道中等题题1423.可获得的最大点数思路: n 表示数组总数,先算出数组总和,用滑动窗口选出剩下连续(n-k)个数的最小和,用总和-剩余数最小和,即得拿走数的最大值.(逆向思维,正难则反) 耗时≈一小时 明天继续