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

高精度除法【c++实现】超详细讲解 高精度除低精度,原理是模拟竖式除法,和高精度其他算法一样都可以手动计算来感受一下实现方法。下面来一个较为简单的例子:1532 ÷ 21 = 72......20。高精度算法分为两种,高精除以低精和高精除以高精。不要看都是除法,就认为原理类似,其实是有很大差距的。让我们一起来学习吧!有句话说在前面,如果除数等于0,就不要算了,不成立。 阅读详情

在这里插入图片描述

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

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



前言

在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;
}

总结

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

高精度除法(C++版) 这里的高精度除法指的是大整数除以大整数,求得商和余数,不作浮点数计算。 阅读详情

相关推荐

【c++】算法:高精度(经典加减乘除){含解析(图解)}

Hi~o(* ̄▽ ̄*)ブ,今天来一起看看c++算法之高精度 之后会持续更新有关c++算法系列,欢迎观看!(#^.^#)

2301_79982543的博客 3212

C++ 的高精度除法

为什么需要高精度计算 对于 C++ 而言,最大的数据为 long long(64b,8位),对于超过 8B 的数据,C++ 没有对应的数据类型进行表示。所以我们需要知道高精度计算。更详细的解释,可以参考这个网页https://blog.youkuaiyun.com/justidle/article/details/104414459。 高精度除法计算原理 在读小学时,我们做除法都采用竖式方法计算。被除数...

努力中的老周的专栏 1万+

C语言大数运算源码:支持加减乘除乘方取模与二进制

在C语言中,int和long long等原生类型存储位数有限,无法直接处理超出范围的大整数运算。其原理通常采用字符串或数组模拟手工计算,逐位处理进位、借位与试商,从而突破硬件字长限制。这种实现方式不仅加深对数据结构与基础算法的理解,也在课程设计、算法练习及嵌入式场景中具有实用价值。本文分享一套纯逻辑实现的大数运算源码,涵盖加法、减法、乘法、除法、乘方与取模,并同时支持十进制和二进制,适合课程设计与算法学习参考。

weixin_31714129的博客 151

C++高精度(加减乘除)

对两个的数进行计算时,int、long long等数据类型的数据范围显然不够使用时,我们就需要引入。高精度算法本质上时用字符串模拟数字进行计算。其步骤与人工演算过程一致。

wyqxii的博客 3441

华为AR3260路由器NAT回流配置实战:从WEB界面到命令行的完整避坑指南

本文详细解析了华为AR3260路由器NAT回流(Hairpin NAT)的配置原理与实战方法。针对内网用户无法通过公网地址访问内部服务器的常见问题,文章不仅剖析了WEB界面配置的常见报错原因,更提供了清晰、可靠且一劳永逸的命令行(CLI)配置方案与排错指南,帮助企业网络工程师彻底解决内外网访问不一致的难题。

u6v7w8x的博客 874

写一个b站爬虫(思路)

part 0 安装 scrapy, requests part 1 信息获取 打开番剧索引链接(https://www.bilibili.com/anime/index/) F12控制台,选中NETWORK,来到xhr文件,我们可以找到了存放番剧json的地方

kou的博客 486

【高精度加减乘除法、一维二维前缀和&&差分】思路讲解及代码实现

高精度加减乘除法、一维二维前缀和&&差分 思路讲解及代码实现

qq_62839589的博客 1614

nginx配置视频流加密防盗链(一)安装nginx插件

前段时间研究了一下视频流的简单加密防盗链,参考了很多文章,最后总算搞出来了。现在自己总结了一下。

u013294657的博客 1868

[AcWing]高精度加减乘除运算

高精度加,减,乘,除运算高精度加法高精度减法

duchenlong的博客 478

海康威视VS互联网大厂:薪资、福利、工作强度全方位对比

本文全面对比了海康威视与互联网大厂在薪资、福利和工作强度等方面的差异。海康威视提供稳定的薪资结构和较低的工作强度,适合追求专业深度的职场人;而互联网大厂则以高薪和快速成长吸引人才,但工作压力较大。文章还分析了职业发展路径和长期价值,帮助求职者做出明智选择。

weixin_29171129的博客 390

ARM功耗管理软件之DVFS&AVS

思考:功耗管理软件栈及示例?WFI&WFE?时钟&电源树?DVFS&AVS?

AI-安全-功耗 1232

高精度计算

重点: 高精度数的读入与输出 高精度数的加减乘除 难点: 高精度数的除法 高精度计算的优化 为什么要用到高精度计算? int long long double 等进行计算的精度只有十几位,如果要进行数十、百、千、万位的数的计算就要用到高精度计算 ...

flymist的博客 5679

25、BDS-3卫星信号性能与PPP-B2b增强消息完整性分析

本文对BDS-3卫星信号性能及PPP-B2b增强消息的完整性进行了系统分析。评估了MEO、IGSO和GEO卫星的轨道与时钟精度,得出BDS-3总体SISRE为0.25 m,系统完整性可覆盖99.999%的误差。分析表明SIS中断主要由时钟调整和轨道机动引起,个别卫星存在因境外监测受限导致的非计划中断。通过自研解码软件对PPP-B2b增强消息进行采集与解析,实验结果显示BDS-3和GPS的平均历元完整性率均高于98.55%,其中卫星掩码和时钟校正消息的完整性率超过99.8%。研究还发现IGSO卫星相比MEO卫

quiet的专栏 145

【练习02|C语言】高精度的加减乘除

要求:对大数进行加减乘除运算 解题思路: 由于大数的位数已经超过了一般整型的数位范围(9位),因此需要以字符串的形式读入。即,将大数的每一位用一个字符数组保存,之后再进行转换计算。 加法:两个大数(正数)相加求和 解题思路: 以字符串形式读入两个加数。 将两个加数的每一位用 /* ======================================== Created by @Cang996 on 2021/1/14 ==============================

萌新菜鸡码dog 1003

【图像增强】论文精读:Correlation Matching Transformation Transformers for UHD Image Restoration(UHDformer)

论文题目:Correlation Matching Transformation Transformers for UHD Image Restoration —— 用于UHD图像恢复的相关匹配变换变压器AAAI 2024!本文提出了一种用于超高清(UHD)图像恢复的通用变压器UHDformer。UHDformer包含两个学习空间:(a) 高分辨率空间中的学习,(b)低分辨率空间中的学习。前者学习多层次的高分辨率特征,融合低层特征,重建残差图像,后者从高分辨率特征中学习更多的代表性特征,以促进更好的恢复。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 291

2026年高教社杯数学建模国赛A题解题思路:从物理方程推导到MATLAB高效求解的全流程实战指南

□所有代码能够从头运行到尾,不报错(清除workspace重新跑一遍)□论文中的每个图号、表号、公式编号与正文引用一致□附录中附上核心代码(注意:不是全部代码,而是关键求解器和后处理部分)□支撑材料压缩包包含完整代码、数据文件、README说明□摘要字数严格控制在1000字以内,突出创新点和核心结果□。

YOLO 110

【蓝桥杯软件赛 零基础备赛20周】第5周——高精度大数运算与队列

Queue的文档:https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/util/Queue.html。超过64位的大数计算,Java和Python都能直接算,而C++不能直接算,需要用数组来模拟大数的存储。这个手写队列是用list实现的,进队尾用append()实现,队列自动扩展,不会有溢出问题。这个手写代码有一个严重缺陷:如果进入队列的数据太多,使得tail超过了N,数组que[N]就会溢出,导致出错。

Sofice小司的小星球 1689

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

基础算法6——高精度算法 加减乘除 C语言

高精度加减乘除 源码

m0_61628700的博客 1210

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

高精度加减乘除算法

乘除的思想方式与加减法不同,同样我们在草稿纸计算乘除法是将乘数或除数当做一个整体去跟另一个乘数或者被除数进行运算,因此乘数和除数是不能当做数字栈进行处理的。可以想想平常草稿纸上我们是怎么做加法计算,从最末位依次加到最前位,过十进一,那么实现思路有了。整数型无论多少位都不会出现计算错误,浮点型小数位十六位出现错误。long型可以实现18位整数的加减,第19位出现错误。long型可以实现9位整数的运算,10位出现错误。int型可以实现18位运算,19位出现错误。可以实现15位的运算,16位出现错误。

qq_30258721的博客 538

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

高精度运算(c程序)

上午参加了ACM培训,先研究最基本的高精度运算~~~~#include #include #include #include int an,bn,fa=1,fb=1;         /* 把an,bn,k设为全局变量,an纪录第一个高精度数组的位数,bn纪录第二个高精度数组的位数,k纪录输出结果的位数*/char b1[250], b2[250];           /*纪录需要计算的

Mr. David 专栏 4862

高精度运算

高精度 1. 高精度原理 原理 利用vector对很大的数据(long long没法存下,一般用string存储)进行计算,可以分为高精度加减乘除,对于给定A、B(位数最多为10610^6106),给定b(b<=1000),求:(1)A+B;(2)A-B;(3)A*b;(4)A/b。 具体每个细节可以参考下面的题目。 2. AcWing上的高精度题目 AcWing 791. 高精度加法 问题描述 问题链接:AcWing 791. 高精度加法 分析 首先就要考虑数据

weixin_42638946的博客 829

从int溢出到万位运算:手写高精度算法实战解析

在计算机科学中,内置整型(如int和long long)的位数限制常导致数值溢出,当数据规模超过2^31-1时,普通运算无法保证精确性。高精度算法通过数组模拟竖式运算,将超长整数逐位拆分并逐位计算,实现任意精度的大数运算。该技术广泛应用于算法竞赛、密码学、科学计算与工程实践中,是突破内置类型限制、解决大数精确计算问题的核心方案。本文从整型溢出问题切入,系统讲解高精度加减乘除的存储原理、进位借位处理、比较逻辑及代码实现,并介绍万进制压位等性能优化技巧,最后通过大数阶乘实例验证算法正确性,帮助开发者完整掌握手写

weixin_29574585的博客 231

高精度 加减乘除

目录791. 高精度加法792. 高精度减法 791. 高精度加法 https://www.acwing.com/problem/content/793/ #include<cstdio> #include<iostream> #include<cstring> #include<vector> using namespace std; vector<int> add(vector<int> A,vector<int> B

bettle_king的博客 337

高精度算法原理与实现:大整数运算全解析

高精度算法是处理超出标准数据类型范围的大整数运算的核心技术,通过将大数拆分为多个小单元进行存储和计算,有效解决了密码学、科学计算等领域的大数处理需求。其基本原理包括数组存储结构设计、人工计算过程模拟以及进位借位处理机制。在工程实践中,高精度算法常采用整型数组倒序存储优化运算效率,并通过进制转换、内存预分配等技巧提升性能。现代开源库如GMP提供了高度优化的实现,而算法优化如Karatsuba乘法、FFT变换等进一步将复杂度从O(n²)降至O(n log n)。典型应用场景包括RSA加密、天文计算和金融系统,其

weixin_33491377的博客 43

高精度加减乘除

高精度加减乘除 加法 思想就是模拟加法的过程,我们先将两个数逆序之后进行操作,便于进位 /* 思想是模拟数据加减的过程 */ #include<iostream> #include<vector> using namespace std; vector<int> add (vector<int> &A,vector<int> &B) //传地址可以减少数据再次复制 { vector<int> C; i

qq_52571929的博客 220
上一篇: 冒泡排序、选择排序、插入排序、快速排序详解
下一篇: 洛谷题解 - B2015 计算并联电阻的阻值
Python_enjoy
博客等级 码龄4年 1201粉丝 52原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值