使用C++,实现高精度加减乘除法运算!

在这里插入图片描述

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页

我的专栏: \mathcal{{\color{Green} 我的专栏:} } 我的专栏: 《精选文章》《算法》《每日一道编程题》《高精度算法》


文章目录

  • 前言
  • 高精度计算初始模版
  • string 转数组
  • int 转数组
  • 输出数组
  • 加减乘除
  • 完整模版代码
  • 总结


前言

在C++中,储存数据是我们一般用int,long long等自带的数据结构来实现。
但是如果数据非常非常大,单单使用这些就存不下来了!

这时候,我们就要使用高精度计算了

高精度计算的原理其实就是模拟我们常用的竖式计算,使用数组存储。

高精度计算初始模版

我们可以使用数组A,B,C来存储数据,使用string来输入,代码如下:

#include <bits/stdc++.h>
using namespace std;int A[1005], B[1005], C[1005];
/**/;
int main() {string a,b;cin>>a>>b;/**/;return 0;
}

string 转数组

此时就有人要问了:“喂喂喂 string 跟数组完全不是一回事好吗?”
的确,确实不是一回事,所以我们要写一个函数,叫 s2BIG,传入参数字符串 s 和数组 a,将 s 存入 a 中,其中 a[0] 为长度,代码如下:

void s2BIG(string s, int a[]) {a[0] = s.length();for (int i = 1; i <= a[0]; i++) {a[i] = s[a[0] - i] - '0';}
}

int 转数组

此时又有人要问了:“要是我想要将int类型的数据如上存入数组,请问阁下该如何应对呢?”
这很简单,我们要再写一个函数,叫 i2BIG,传入参数 int 类型的整数 s 和数组 a,代码如下:

void i2BIG(int s, int a[]) {while (s > 0) {a[0]++;a[a[0]] = s % 10;s /= 10;}if (s == 0) {a[0] = 1;}
}

输出数组

有的小伙伴已经按捺不住,想要输出我们存入的数据了。此时我们需要编写一个函数 printBIG,只需导入要输出的数组 a,代码如下:

void printBIG(int a[]) {for (int i = a[0]; i >= 1; i--) {cout << a[i];}cout << endl;
}

加减乘除

你现在已经写完了基础部分,那么现在只需加入加减乘除函数,你就完成了所以的模版代码,所以我干脆一口气全给你算了,注意前两个参数是你给到的数据,后一个是处理完之后数据存放的地方,代码如下:

void addBIG(int a[], int b[], int c[]) {c[0] = max(a[0], b[0]);int carry = 0;for (int i = 1; i <= c[0]; i++) {c[i] = a[i] + b[i] + carry;carry = c[i] / 10;c[i] %= 10;}if (carry == 1) {c[0]++;c[c[0]] = 1;}
}void subBIG(int a[], int b[], int c[]) {c[0] = max(a[0], b[0]);for (int i = 1; i <= c[0]; i++) {c[i] = a[i] - b[i];}for (int i = 1; i <= c[0]; i++) {if (c[i] < 0) {c[i] += 10;c[i + 1]--;}}while (c[c[0]] == 0 && c[0] > 1) {c[0]--;}
}void mulBIG(int a[], int b, int c[]) {c[0] = a[0];for (int i = 1; i <= c[0]; i++) {c[i] = a[i] * b;}for (int i = 1; i <= c[0]; i++) {c[i + 1] += c[i] / 10;c[i] %= 10;if (c[c[0] + 1] > 0) {c[0]++;}}
}void divBIG(int a[], int k, int c[]) {int r = 0;for (int i = a[0]; i >= 1; i--) {c[i] = a[i] + r * 10;r = c[i] % k;c[i] /= k;}int len = a[0];while (c[len] == 0 && len != 1)len--;c[0] = len;
}

完整模版代码

完整模版代码如下:

#include <bits/stdc++.h>
using namespace std;int A[1005], B[1005], C[1005];void s2BIG(string s, int a[]) {a[0] = s.length();for (int i = 1; i <= a[0]; i++) {a[i] = s[a[0] - i] - '0';}
}void i2BIG(int s, int a[]) {while (s > 0) {a[0]++;a[a[0]] = s % 10;s /= 10;}if (s == 0) {a[0] = 1;}
}void printBIG(int a[]) {for (int i = a[0]; i >= 1; i--) {cout << a[i];}cout << endl;
}void addBIG(int a[], int b[], int c[]) {    // 加法c[0] = max(a[0], b[0]);int carry = 0;for (int i = 1; i <= c[0]; i++) {c[i] = a[i] + b[i] + carry;carry = c[i] / 10;c[i] %= 10;}if (carry == 1) {c[0]++;c[c[0]] = 1;}
}void subBIG(int a[], int b[], int c[]) {    // 减法c[0] = max(a[0], b[0]);for (int i = 1; i <= c[0]; i++) {c[i] = a[i] - b[i];}for (int i = 1; i <= c[0]; i++) {if (c[i] < 0) {c[i] += 10;c[i + 1]--;}}while (c[c[0]] == 0 && c[0] > 1) {c[0]--;}
}void mulBIG(int a[], int b, int c[]) {    // 乘法c[0] = a[0];for (int i = 1; i <= c[0]; i++) {c[i] = a[i] * b;}for (int i = 1; i <= c[0]; i++) {c[i + 1] += c[i] / 10;c[i] %= 10;if (c[c[0] + 1] > 0) {c[0]++;}}
}void divBIG(int a[], int k, int c[]) {    // 除法int r = 0;for (int i = a[0]; i >= 1; i--) {c[i] = a[i] + r * 10;r = c[i] % k;c[i] /= k;}int len = a[0];while (c[len] == 0 && len != 1)len--;c[0] = len;
}int main() {string a,b;cin>>a>>b;s2BIG(a,A);s2BIG(b,B);return 0;
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了高精度的使用,高精度可以让你忽视以后所有题目的数据大小。

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

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

相关文章

Web APIs -05

js执行机制 js是单线程&#xff0c;同一个时间只能做一件事情&#xff0c;所有任务需要排队所以有时候会渲染不连贯 同步任务 都在主线程上执行&#xff0c;形成一个执行栈 异步任务 js的异步是通过回调函数实现的分为三类&#xff1a;1.普通事件&#xff1a;click等&…

秒懂百科,C++如此简单丨第二十天:贪心算法2

目录 Everyday English 前言 洛谷 P1031 均分纸牌 题目描述 思路点拨 AC代码 洛谷 P1094 纪念品分组 题目描述 样例输入 样例输出 思路点拨 AC代码 洛谷 P2660 zzc 种田 题目描述 思路点拨 AC Code 结尾 Everyday English Dont miss the opportunity. 机不可…

文件管理大师:深入解析Linux的文件与目录操控

目录 一、文件命名规则 1、可以使用哪些字符? 2、文件名的长度 3、Linux文件名大小写 4、Linux文件扩展名 二、文件管理命令 1、目录创建/删除 mkdir创建目录 直接创建文件夹 创建多个文件夹 递归创建写法 总结mkdir 删除空目录 2、文件创建、删除 touch创建文…

【图像分割 2024】ParaTransCNN

【图像分割 2024】ParaTransCNN 论文题目&#xff1a;ParaTransCNN: Parallelized TransCNN Encoder for Medical Image Segmentation 中文题目&#xff1a;用于医学图像分割的并行TransCNN编码器 论文链接&#xff1a;https://arxiv.org/abs/2401.15307 论文代码&#xff1a;H…

UI风格汇:毛玻璃风格风靡的原因解读

Hello&#xff0c;我是大千UI工场&#xff0c;设计风格是我们新开辟的栏目&#xff0c;主要讲解各类UI风格特征、辨识方法、应用场景、运用方法等&#xff0c;本次带来的是毛玻璃风格的解读&#xff0c;有设计需求可以私聊。 一、什么是毛玻璃风格 毛玻璃风格&#xff08;Fros…

(08)Hive——Join连接、谓词下推

前言 Hive-3.1.2版本支持6种join语法。分别是&#xff1a;inner join&#xff08;内连接&#xff09;、left join&#xff08;左连接&#xff09;、right join&#xff08;右连接&#xff09;、full outer join&#xff08;全外连接&#xff09;、left semi join&#xff08;左…

鸿蒙系统优缺点,能否作为开发者选择

凡是都有对立面&#xff0c;就直接说说鸿蒙的优缺点吧。 鸿蒙的缺点&#xff1a; 鸿蒙是从2019年开始做出来的&#xff0c;那时候是套壳Android大家都知晓。从而导致大家不看鸿蒙系统&#xff0c;套壳Android就是多次一举。现在鸿蒙星河版已经是纯血鸿蒙&#xff0c;但是它的…

高性能MySQL 阅读笔记

mysql由服务器端与存储引擎两部分组成&#xff0c;存储引擎部分的锁机制对服务器端是透明的。服务器端内置缓存机制&#xff0c;有解析器和优化器机制。不同的存储引擎对事务、并发等都用不同的处理。 ACID代表的特性&#xff1a;原子性、一致性、隔离性、持久性 共享锁与排他…

【Web】CTFSHOW java刷题记录(全)

目录 web279 web280 web281 web282 web283 web284 web285 web286 web287 web288 ​web289 web290 web291 web292 web293 web294 web295 web296 web297 web298 web299 web300 web279 题目提示 url里告诉我们是S2-001 直接进行一个exp的搜 S2-001漏洞分析…

网络安全最典型基础靶场-DVWA-本地搭建与初始化

写在前面&#xff1a; 之前也打过这个 DVWA 靶场&#xff0c;但是是在虚拟机环境下的一个小块分区靶场&#xff1b; 本篇博客主要介绍在本地搭建 DVWA 靶场以及靶场的初始化&#xff0c;后续会陆续更新通关教程。 由于我们是在本地搭建&#xff0c;则需要基于你已经装好 phpstu…

C++数据结构与算法——双指针法

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

Windows 连接共享文件夹 切换/退出账号操作

工作中遇到个问题&#xff0c;登录公司内部共享文件夹&#xff0c;使用自己的账号&#xff0c;但需要切换别人账号找东西时&#xff0c;没有发现登出的地方。在网上找了两种方法&#xff1a;通过命令行登出账号的方法 &#xff08;1&#xff09;打开cmd命令提示符&#xff0c;…