使用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.mzph.cn/news/686169.shtml

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

相关文章

【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漏洞分析…

【测试】测试用例篇

目 录 一. 设计测试用例的万能公式(六个)二.设计测试用例的具体方法1.等价类2.边界值3.因果图&#xff08;判定表&#xff09;4.场景设计法5.正交法6.错误猜测法 一. 设计测试用例的万能公式(六个) 设计测试用例的万能公式 测试用例的意义是帮助测试人员了解&#xff1a;测什…

linux 网络服务小实验

实验图和要求&#xff1a; 1&#xff09;网关服务器&#xff1a;ens36&#xff1a;12.0.0.254/24&#xff0c;ens33&#xff1a;192.168.44.254/24&#xff1b;Server1&#xff1a;192.168.44.20/24&#xff1b;PC1和Server2&#xff1a;自动获取IP&#xff1b;交换机无需配置。…

GEE:最小距离(minimumDistance)回归教程(样本点、特征添加、训练、精度、参数优化)

作者:CSDN @ _养乐多_ 对于分类问题,这个输出通常是一个类别标签 ,而对于回归问题,输出通常是一个连续的数值。回归可以应用于多种场景,包括预测土壤PH值、土壤有机碳、土壤水分、碳密度、生物量、气温、海冰厚度、不透水面积百分比、植被覆盖度等。 本文将介绍在Google…

GB/28181 2022 上联检测项

序号 检测项目 技术要求 1平台注册 (上联) 受测平台注册到视频监控联网测试软 件,并在注册到期前进行刷新注册,注册 应携带协议版本标识 宜支持注册重定向功能 2平台注销 ( 上联 ) 受测平台从视频监控联网测试软件注 销 3平台校时 (上联) 受测平台从视频监控联网测试软…

频繁跳槽 可能问题出在你的性格上

谈到跳槽&#xff0c;小伙伴们会想到什么呢&#xff1f;换工作&#xff1f;涨薪&#xff1f;你有没有想过&#xff0c;目前的工作不合适&#xff0c;除了公司的原因&#xff0c;也有可能是自己性格的原因呢&#xff1f; 频繁跳槽有哪些优势和劣势呢&#xff1f;针对这些疑问&…

2024年【A特种设备相关管理(电梯)】找解析及A特种设备相关管理(电梯)模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 A特种设备相关管理&#xff08;电梯&#xff09;找解析是安全生产模拟考试一点通生成的&#xff0c;A特种设备相关管理&#xff08;电梯&#xff09;证模拟考试题库是根据A特种设备相关管理&#xff08;电梯&#xff…

【STM32 CubeMX】I2C层次结构、I2C协议

文章目录 前言一、I2C的结构层次1.1 怎样在两个设备之间传输数据1.2 I2C如何传输数据1.3 硬件框图1.4 软件层次 二、IIC协议2.1 硬件连接2.2 I2C 总线的概念2.3 传输数据类比2.3 I2C信号2.4 I2C数据的含义 总结 前言 在STM32 CubeMX环境中&#xff0c;I2C&#xff08;Inter-In…

开年炸裂-Sora/Gemini

最新人工智能消息 谷歌的新 Gemini 模型 支持多达 1M的Token&#xff0c;可以分析长达一小时的视频 1M Token可能意味着分析700,000 个单词、 30,000 行代码或11 小时的音频、总结、改写和引用内容。 Comment&#xff1a;google公司有夸大的传统&#xff0c;所以真实效果需要上…

零基础学c++(第一节)

c啊&#xff0c;说白了就是为NOI做准备也就是信息学竞赛。 最基础必用模版&#xff1a; #include <bits/stdc.h> using namespace std; int main(){} 头文件 &#xff1a; #include <bits/stdc.h> 这是头文件&#xff0c;c中有许多头文件&#xff0c; 意思就是…

剪辑思维大学习(Day6) - 视频剪辑万能结构?

目录 一、写在前面 二、思路总结 1.五种音画表现形式 1&#xff09;.音乐表现力画面 2&#xff09;.音乐日常实拍 3&#xff09;.独白旁白有表现力的画面 4&#xff09;.文字画面音乐 5&#xff09;.画面音效 2.十种剪辑结构 一、写在前面 正在学习Pr剪辑&#xff0c…

鸿蒙语言ArkTS(更好的生产力与性能)

ArkTS是鸿蒙生态的应用开发语言 ArkTS提供了声明式UI范式、状态管理支持等相应的能力&#xff0c;让开发者可以以更简洁、更自然的方式开发应用。 同时&#xff0c;它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;进一步通过规范强化静态检…

qt-C++笔记之打印所有发生的事件

qt-C笔记之打印所有发生的事件 code review! 文章目录 qt-C笔记之打印所有发生的事件1.ChatGPT问答使用 QApplication 的 notify 方法使用 QObject 的 event 方法 2.使用 QObject 的 event 方法3.使用 QApplication 的 notify 方法 1.ChatGPT问答 在Qt C中&#xff0c;若要打…

老兵(11)

百度文心一格&#xff0c;大约是一年前上线并免费向用户开放的。其实也不是免费&#xff0c;而是“电量”比较好获得&#xff0c;白送的就16/每天&#xff0c;如果只是好奇玩玩的话也算够吧。 当时就很开心&#xff0c;因为一直想着把一些文案图像化&#xff0c;做成漫画的形式…

从被“大V”忽悠到自主开发投资分析系统:我在基金投资中的跌宕起伏与转变

从被“大V”忽悠到自主开发投资分析系统&#xff1a;我在基金投资中的跌宕起伏与转变 回顾我初次涉足基金投资的经历&#xff0c;那是一段由盲目跟从、亏损惨重到痛定思痛、自我提升的曲折历程。起初&#xff0c;我深受某些财经“大V”的影响&#xff0c;他们凭借看似精准的市…

算法刷题:复写零

复写零 .习题链接题目描述算法原理初始值步骤1步骤2我的答案: . 习题链接 复写零 题目描述 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素…

[uniapp页面路由跳转]详细讲解uniapp中使用标签和的api完成页面跳转使用方法 代码注释

目录 一、标签跳转--- 把跳转的信息写在标签当中1. a标签2. navigator标签 二、API跳转[编程式]-----通过方法 js方式跳转1. uni.navigateTo2. uni.redirectTo3. uni.switchTab4. uni.reLaunch5. uni.navigateBack 总结 Uniapp是一款基于Vue.js的跨平台开发框架&#xff0c;允许…

LEETCODE 164. 破解闯关密码

class Solution { public:string crackPassword(vector<int>& password) {vector<string> password_str;for(int i0;i<password.size();i){password_str.push_back(to_string(password[i]));}//希尔排序int gappassword.size()/2;while(gap>0){for(int i…

c++中的模板(5) -- 类模板与继承

目录 1. 父类是类模板&#xff0c;子类不是类模板。 代码分析: 总结: 2. 父类是普通类&#xff0c;子类是类模板。 代码分析: 3. 父类和子类都是类模板 前面我们说到的类模板是在一个类中&#xff0c;分类内实现&#xff0c;类外实现和分文件写几种情况。继承是类…

Eclipse Version: 2023-03 (4.27.0) JDK19 Tomcat10.2

Eclipse Version: 2023-03 (4.27.0) JDK19 Tomcat10.2