news 2026/5/1 7:54:37

高精度减法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
高精度减法

当在减法计算中,有时候数很大,当超出long long 的范围的时候,我们需要利用高精度算法来计算。

此时我们不在利用int/long long 来存储数据,而是用string来存储数据。用字符串存储两个很大的整数,在用数组存储数据之前,需要进行判断,减数和被减数谁更大,谁大把谁当成被减数(如果被减数<减数,最后在前面加一个负号即可),之和再开辟两个数组,把两个字符串里面存储的数字逆序存储在int数组中,(保证两个数字的低位对齐,方便计算),之和再遍历长度最长的那个数据,让两个数组对应下标的值相减,这个时候会产生借位问题,(以十进制为例)当被减数该下标的值小于减数该下标的值,就让该下标+1对应的值减一,该下标的值+10,之后再喝减数该下标的值相减(其他进制(n进制)只需要把10换成n即可(16进制除外,需要转换字母));

在输出的时候,要注意可能会有前导0(就是比如222和221,按以上方法会输出001,我们需要删除前面的两个0),删除前导0之后在进行输出(注意如果前面被除数和除数进行了交换,需要加负号),具体代码/注释如下

#include<bits/stdc++.h> using namespace std; int main() { //用数组模拟高精度 //整型数组 //反转存储:低位对齐 //高精度算法只能输入字符串 string s1, s2; cin >> s1 >> s2; int flag = 1; //标记(判断什么时候两个数交换) //当第二个数大于第一个数的时候,两数交换,(让大数减小数) //不能直接s2>s1因为当两个字符串的长度不一样的时候,且第一个字符串的前几个字符比s2大的时候,就无法正确比较 if ((s2>s1&&s1.size()==s2.size())||s2.size()>s1.size()) { string s3; s3 = s2; s2 = s1; s1 = s3; flag = 0; } int lmax = max(s1.size(), s2.size()); vector<int> vec3(lmax + 2); vector<int> vec1(lmax+2); vector<int> vec2(lmax+2); //给两数组赋值 for (int i = 0; i < s1.size();i++) { vec1[s1.size() - i] = s1[i]-'0'; //赋值为和字符‘0’的差值,不可以使用stoi,因为这是字符转数字 } for (int i = 0; i < s2.size(); i++) { vec2[s2.size() - i] = s2[i]-'0'; } for (int i = 1; i <= lmax;i++) { if (vec1[i]<vec2[i]) { //当被减数当位数字小于减数当位数字,就需要借位 vec1[i + 1]--; //借位 vec1[i] += 10; //(n进制把10换成n) } vec3[i] = vec1[i] - vec2[i]; } while (vec3[lmax]==0&&lmax>1) { //因为数组从下标1开始存的数,所以lmax得大于1 lmax--; //删除高位的0 } if (!flag) { //如果满足上面交换就需要加负号 cout << "-"; } for (int i = lmax; i >= 1;i--) { cout << vec3[i]; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:21:58

基于SpringBoot+Vue的养老院管理系统(源码+lw+部署文档+讲解等)

课题介绍 本课题旨在设计实现基于SpringBootVue的养老院管理系统&#xff0c;聚焦养老机构管理人员、护理人员、老人及家属的日常照护、健康监测、人员管控、家属对接及运营数据管理核心需求&#xff0c;破解传统养老院管理依赖人工登记、照护记录零散、健康监测滞后、家属沟通…

作者头像 李华
网站建设 2026/4/30 13:09:38

26.Trie树

一.Trie树的概念 二.Trie树的实现 1.准备工作 #include <iostream> #include <cstring>using namespace std; const int N = 1e6 + 10;int tree[N][26], p[N], e[N];int idx; 2.插入字符串 void insert(string

作者头像 李华
网站建设 2026/4/30 17:30:14

深度学习篇---CBAM通俗易懂解析

一、CBAM是什么&#xff1f;一个简单的比喻 CBAM Convolutional Block Attention Module 翻译&#xff1a;卷积块注意力模块 1.1 最通俗的比喻 想象你的眼睛在看一张复杂的照片&#xff1a; 通道注意力&#xff1a;决定看什么颜色更重要&#xff08;比如红色汽车在绿色背景…

作者头像 李华
网站建设 2026/5/1 6:57:42

ARM汇编语言语法小解

ARM汇编语言语法小解 文章目录ARM汇编语言语法小解一、基本架构特点二、基本语法结构1. 指令格式2. 程序组成三、寄存器1. 通用寄存器&#xff08;32位&#xff09;2. 特殊寄存器四、指令分类与语法1. 数据处理指令2. 加载/存储指令3. 分支指令4. 移位操作五、寻址方式1. 立即数…

作者头像 李华