高精度算法(加减乘除)

高精度算法

  • 高精度加法
  • 高精度减法
  • 高精度乘法
  • 高精度除法

高精度加法

高精度加法:反向存数组里,人工模拟两数相加

#include <iostream>
#include <string>
#include <vector>
using namespace std;
string s1, s2;
void add(vector<int>& A, vector<int>& B)
{vector<int> c;int t = 0;for(size_t i = 0; i < A.size() || i < B.size(); i++){int ret = t;if(i < A.size()) ret += A[i];if(i < B.size()) ret += B[i];c.push_back(ret % 10);t = ret / 10;}if(t > 0) c.push_back(t);for(int i = c.size() - 1; i >= 0; i--){cout << c[i];}
}
int main()
{vector<int> A;vector<int> B;cin >> s1 >> s2;for(int i = s1.size() - 1; i >= 0; i--) A.push_back(s1[i] - '0');for(int i = s2.size() - 1; i >= 0; i--) B.push_back(s2[i] - '0');add(A, B);return 0;
}

高精度减法

高精度减法
将大数字符串反向存在数组里,保证算法实现的时候为较大数 - 较小数,所以要添加一个比较函数 cmp ,如果题目是 小 - 大,要给最终结果前面加一个负号

  1. 比较函数 cmp ,保证算法里是 大 - 小;实现时,先判断 size 相等的情况,依次比较每一位,这些位中,如果哪一位不相等,就直接 return,如果不相等就直接返回 size 是否较大
  2. flag 标志,flag 的值决定是否在打印前先输出 -
  3. 前导零的处理,前导零是直接出现在 C 的末尾的,直接判断再 pop 即可
  4. 可以逆置,也可以不逆置,不逆置就反正输出即可

易错点:算法在实现的过程中,循环次数是 A.size()次,同时在循环里判断是否要减去 B[i],因为 B 有可能会越界,用 A来循环时为了保证 减完 B 之后方便将余下的借位处理掉

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool flag = 1;
bool Cmp(vector<int>& A, vector<int>& B)
{if(A.size() == B.size()){for(int i = A.size() - 1; i >= 0; i--){if(A[i] != B[i]) return A[i] > B[i];}}return A.size() >= B.size(); // 包含 A == B
}
int Sub(vector<int>& A, vector<int>& B)
{vector<int> C;int t = 0; // 被借的位for(size_t i = 0; i < A.size(); i++){t = A[i] - t;if(i < B.size()) t -= B[i];C.push_back((t + 10) % 10); // 完美解决 t > 0 和 t < 0 的情况if(t < 0) t = 1;else t = 0;}for(size_t i = C.size(); i < A.size(); i++) C.push_back(A[i]);// 删除前导零while(C.size() > 1 && C.back() == 0) C.pop_back();if(!flag) cout << "-";for(int i = C.size() - 1; i >= 0; i--) cout << C[i];
}
int main()
{string a, b;cin >> a >> b;vector<int> 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');if(!Cmp(A, B)) {flag = 0;swap(A, B);}Sub(A, B);
}

高精度乘法

高精度 * 低精度
将高精度存在数组里,低精度看作一个整体,模拟人工乘法,注意处理进位
当两个数中有 0 时,可特判,也可当前导零直接处理

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;void Mul(vector<int>& A, int b)
{vector<int> C;int t = 0;for(size_t i = 0; i < A.size() || t > 0; i++){if(i < A.size()) t = A[i] * b + t;C.push_back(t % 10);t /= 10;}while(C.size() > 1 && !C.back()) C.pop_back(); // 去除 A 或 b 为 0 时导致的前导 0 // reverse(C.begin(), C.end()); // 可以逆序后再按序输出, 也可以直接输出// for(size_t i = 0; i < C.size(); i++) cout << C[i]; for(int i = C.size() - 1; i >= 0; i--) cout << C[i];
}
int main()
{string a;int b;cin >> a >> b;vector<int> A;for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');Mul(A, b);return 0;
}

高精度除法

高精度 / 低精度 --> 商 和 余数,计算出的余数可以当作取模运算的结果

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void Div(vector<int>& A, int b)
{vector<int> C; // 存结果int t = 0;int rem; // 存余数for(int i = A.size() - 1; i >= 0; i--){t = t * 10 + A[i];C.push_back(t / b);t %= b;}rem = t;reverse(C.begin(), C.end());while(C.size() > 1 && !C.back()) C.pop_back(); // 去除前导0for(int i = C.size() - 1; i >= 0; i--) cout << C[i]; // 输出商cout << endl << rem; // 输出余数 
}
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');Div(A, b);return 0;
}

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

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

相关文章

代码随想录算法训练营day21|530.二叉搜索树的最小绝对值差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

二叉搜索树的最小绝对值差 递归法 首先需考虑这是一个二叉搜索树&#xff0c;在中序遍历后的结果为从小到大的一个序列&#xff0c;寻找二叉搜索树的最小绝对值差&#xff0c;只需比较一个节点与之后的差值即可。在遍历的过程中&#xff0c;我们需要一个节点保存前节点…

短道速滑短视频:四川京之华锦信息技术公司

短道速滑短视频&#xff1a;冰雪激情的视觉盛宴 随着冬奥会的热度不断攀升&#xff0c;短道速滑作为其中一项紧张刺激、充满观赏性的运动&#xff0c;受到了越来越多人的关注。而在社交媒体和短视频平台的助力下&#xff0c;短道速滑短视频成为了人们了解、欣赏这项运动的新窗…

vxe-form-design 表单设计器的使用

vxe-form-design 在 vue3 中表单设计器的使用 查看官网 https://vxeui.com 安装 npm install vxe-pc-ui // ... import VxeUI from vxe-pc-ui import vxe-pc-ui/lib/style.css // ...// ... createApp(App).use(VxeUI).mount(#app) // ...使用 github vxe-form-design 用…

Python在忘mysql密码后该如何重新连mysql

步骤一 先到mysql的bin目录下 步骤二 用mysqld delete mysql 把之前的库删了 步骤三 通过管理员模式进去后 用命令mysqld --skip-grant-tables越过验证 再输入mysql -u root 直达账户 步骤四 用FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY new_password; 指…

汽车热管理:新能源汽车发展的关键技术

在全球气候变化和能源危机的背景下,新能源汽车作为一种可持续的交通方式,正逐渐成为汽车行业的发展趋势。然而,新能源汽车的发展也面临着一些挑战,其中之一就是热管理问题。汽车热管理系统的设计和优化,对于提高新能源汽车的性能、延长电池寿命、提高能源效率以及确保乘客…

关于实践中生产调度技术落地应用时的挑战

文章目录 1. 问题背景2. 实践中常见的调度技术2.1 基于优先级调度规则2.2 基于搜索的排程技术2.3 基于瓶颈调度的方法2.4 基于知识的排程方法3. 调度技术落地时的挑战及建议3.1 存在不确定的干扰因素3.2 调度方案的生成方法与实际生产结构不匹配3.3 依据严苛时间表派工的压力3.…

Echarts x轴坐标二级分组

在使用echarts 封装组件的时候&#xff0c;偶尔会遇到需要x轴坐标进行二层分组的需求。那么如何对echarts 进行二层分组呢&#xff0c;有以下几个步骤&#xff1a; 仅介绍二层分组的逻辑。有兴趣的可以进行三层延伸。 1&#xff0c;修改echarts Options 中xAxis 的配置。 此…

交换排序、归并排序、计数排序

冒泡排序&#xff1a; void BubbleSort(int* a, int n) {//第一层循环是趟数&#xff0c;第二层是交换for (int i 0; i < n-2; i){int flag 0;for (int j 0; j < n - 2 - i; j){if (a[j] > a[j 1]){swap(&a[j], &a[j 1]);flag 1;}}if (flag 0){break;…

【机器学习】K-近邻算法(KNN)全面解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 K-近邻算法&#xff08;KNN&#xff09;全面解析概述1. 基本概念与原理1.1 KNN算…

Excel表格保护密码遗忘怎么办?三秒钟破解密码,轻松解锁!

在我们的日常工作中&#xff0c;Excel表格是一个非常实用的工具&#xff0c;但在某些情况下&#xff0c;我们可能会遇到密码忘记的问题&#xff0c;或者在尝试打开或删除文件时被锁定。别担心&#xff0c;这里有三个简单的解决方法来帮助您解决问题。 一、尝试默认密码或常见密…

使用 Orange Pi AIpro开发板基于 YOLOv8 进行USB 摄像头实时目标检测

文章大纲 简介算力指标与概念香橙派 AIpro NPU 纸面算力直观了解 手把手教你开机与基本配置开机存储挂载设置风扇设置 使用 Orange Pi AIpro进行YOLOv8 目标检测Pytorch pt 格式直接推理NCNN 格式推理 是否可以使用Orange Pi AIpro 的 NPU 进行推理 呢&#xff1f;模型开发流程…

gitlab push 代码,密码正确,仍然提示HTTP Basic: Access denied. The provided password

HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password gitlab 登录账户密码确认正确&#xff0c;登录获取代码仍然提示以上问题&#xff0c;解决方案 …

①单细胞学习-数据读取、降维和分群

目录 ①数据读取 ②计算线粒体基因比例 ③分开进行质控 ④两组单细胞数据合并 ⑤细胞周期评分 ⑥降维标准流程 降维 UMAP可视化 选择分群 ⑦marker基因 分析marker基因 marker基因可视化 ⑧细胞定群命名 单细胞的数据格式学习&#xff1a;单细胞 10X 和seurat对象…

SpringBoot项目文件上传校验(注解版)

需求 要实现了一个文件上传和验证的功能&#xff0c;具有以下特点&#xff1a; 1. 自定义注解&#xff1a;FileValidation注解用于标记需要进行文件验证的方法。 2. 文件验证拦截器&#xff1a;FileValidationInterceptor拦截器会在每个请求处理之前被调用。如果请求处理的方…

2024年深圳市专精特新企业申报条件-专精特新企业认定、申请时间、流程及奖励补贴

一、深圳专精特新企业申报对象 根据《优质中小企业梯度培育管理暂行办法》&#xff08;工信部企业〔2022〕63号&#xff09;和《深圳市工业和信息化局优质中小企业梯度培育管理实施细则》&#xff08;深工信规〔2022〕7号&#xff09;相关规定&#xff0c;我局组织开展2023年深…

vue2.0滚动加载组件

vue2.0滚动加载组件 一、直接上代码 需求&#xff1a;刚开始用的element-ui的滚动加载组件&#xff0c;个别电脑会在滚动加载没到底就停止了&#xff0c;怀疑是有bug,就自己写了一个 一、直接上代码 <div class"threadListAttach" ref"replyscrollDom"…

git cloen的错误

~ % git clone https://github.com/xxx/core.git Cloning into core... error: RPC failed; curl 56 Recv failure: Operation timed out error: 56 bytes of body are still expected fatal: expected flush after ref listing看起来在克隆仓库时仍然遇到了问题。错误信息显示…

【软件设计师】算法

1、算法的效率 时间复杂度:程序从开始到结束所需要的时间 空间复杂度&#xff1a;算法在运行过程中临时占用存储空间大小的度量 时间渐近复杂度&#xff1a;时间复杂度由最高次幂决定(判断大小技巧&#xff1a;将n10代入&#xff09; O(log2 n):二分查找法 O(n&#xff09;:for…

MySql8.0.25部署MGR集群

1 准备mysql单机实例 当前部署的mysql使用8.0.25&#xff0c;使用传统的方式初始化data目录&#xff0c;启动服务等。 --初始化&#xff0c;start.conf会放在当前文档目录中 ./mysqld --defaults-file/mgr/start.conf --explicit_defaults_for_timestamp --initialize-insecur…

家政预约小程序07服务分类展示

目录 1 创建服务分类页面2 侧边栏选项卡配置3 配置数据列表4 从首页跳转到分类页总结 上一篇我们开发了首页的服务展示功能&#xff0c;本篇我们讲解一下服务分类功能的开发。在小程序中通常在底部导航栏有一个菜单可以展示所有服务&#xff0c;侧边选项卡可以展示分类信息&…