使用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;
}

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

游泳听音乐最好的耳机推荐,游泳防水耳机排行榜推荐

在当今社会&#xff0c;随着人民生活水平的不断提高&#xff0c;人们对健康生活的追求也越来越高。运动成为了人们日常生活中不可或缺的一部分&#xff0c;而游泳作为一种全身性的锻炼方式&#xff0c;更是受到了广大人群的喜爱。然而&#xff0c;对于音乐爱好者来说&#xff0…

【机构vip教程】​python(1):python正则表达式匹配指定的字符开头和指定的字符结束

一&#xff0c;使用python的re.findall函数&#xff0c;匹配指定的字符开头和指定的字符结束 代码示例&#xff1a; 1 import re 2 # re.findall函数;匹配指定的字符串开头和指定的字符串结尾(前后不包含指定的字符串) 3 str01 hello word 4 str02 re.findall((?<e).*?…

Java学习笔记------static

static 创建Javabean类 public class student {private int age;private String name;private String gender;public student() {}public student(int age, String name, String gender) {this.age age;this.name name;this.gender gender;}/*** 获取* return age*/public…

数据结构——lesson3单链表介绍及实现

目录 1.什么是链表&#xff1f; 2.链表的分类 &#xff08;1&#xff09;无头单向非循环链表&#xff1a; &#xff08;2&#xff09;带头双向循环链表&#xff1a; 3.单链表的实现 &#xff08;1&#xff09;单链表的定义 &#xff08;2&#xff09;动态创建节点 &#…

【Gitea】配置 Push To Create

引 在 Git 代码管理工具使用过程中&#xff0c;经常需要将一个文件夹作为仓库上传到一个未创建的代码仓库。如果 Git 服务端使用的是 Gitea&#xff0c;通常会推送失败。 PS D:\tmp\git-test> git remote add origin http://192.1.1.1:3000/root/git-test.git PS D:\tmp\g…

VMware虚拟机安装CentOS7

对于系统开发来说&#xff0c;开发者时常会需要涉及到不同的操作系统&#xff0c;比如Windows系统、Mac系统、Linux系统、Chrome OS系统、UNIX操作系统等。由于在同一台计算机上安装多个系统会占据我们大量的存储空间&#xff0c;所以虚拟机概念应运而生。本篇将介绍如何下载安…

SaaS系统介绍

本文系个人学习笔记&#xff0c;内容来源于资料整合及个人理解。 1. 概念介绍 SaaS系统英文全称为Software as a Service&#xff08;软件即服务&#xff09;&#xff0c;通俗来讲就是提供固定功能的在线软件。从宏观上看&#xff0c;SaaS有三大特点&#xff1a; 1. 用户无需…

如何在Linux系统中配置并优化硬盘的RAID

在Linux系统中配置和优化硬盘的RAID技术可以帮助提高数据存储性能和安全性。RAID&#xff08;Redundant Array of Independent Disks&#xff09;技术通过将多个硬盘组合起来&#xff0c;以增加性能、容量或冗余度&#xff0c;提高数据的可靠性和可用性。本文将介绍如何在Linux…

代码随想录算法训练营第15天—二叉树04 | ● *110.平衡二叉树 ● *257. 二叉树的所有路径 ● 404.左叶子之和

*110.平衡二叉树 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html 考点 后序遍历二叉树高度计算 我的思路 错误地将平衡二叉树的定义等价为判断整体二叉树的最大深度和最小深度之差是否大于1 视…

黑马程序员-瑞吉外卖-day8

目录 菜品新增 菜品代码准备&#xff1a; 1.entity 2.mapper 3.service 4.sevice目录下的impl目录 5.controller 菜品口味代码准备&#xff1a; 1.entity 2.mapper 3.service 4.sevice目录下的impl目录 菜品新增 分析&#xff1a; 后台系统中可以管理菜品信息&…

胆小勿入!AI创作恐怖电影宣传片《生化危机:重生》

胆小勿入&#xff01;AI创作恐怖电影宣传片《生化危机&#xff1a;重生》 "The city is falling, and the dead walk among us." "In the shadow of the apocalypse, the fight for survival begins." "The streets are silent, but the nightmare …

若依项目改造

ctrlalt l 格式化项目 alt f6 修改包和import包名 替换com.ruoyi 为 com.cj 替换若依版本为自己的版本 将ruoyi改成自己项目的英文名 修改中文名字 修改文件包名 修改有ruoyi的类名 &#xff1a; 验证码生成器包名修改&#xff1a;

蝶阀、球阀、阀门百科

一、D71X是蝶阀的型号其中D 就代表了蝶阀,7 代表是对夹式链接,1代表这个蝶阀是中线结构,x就是密封面材质为橡胶。结合起来D71X表示的就是手柄对夹中线蝶阀。 二、J41H-100C型号字母含义介绍 J41H-100C型号是德特森阀门常用的高压截止阀型号字母代表的意思是: J——代表阀门类…

英文论文(sci)解读复现【NO.21】一种基于空间坐标的轻量级目标检测器无人机航空图像的自注意

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

内存基础知识

内存作用&#xff1a;用来存放数据 int x10&#xff1b; xx1&#xff1b; 这会生成一个可执行文件&#xff08;装入模块&#xff09;然后存入内存地址中 绝对装入&#xff1a;-如果知道程序放到内存中哪个位置&#xff0c;编译程序将产生绝对地址的目标代码 可重定位装入&am…

【MySQL】变量、流程控制

一、变量 在MySQL的存储过程与函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据。它可以分为用户自定义变量与系统变量 1、系统变量 1&#xff09;系统变量分为全局变量&#xff08;需要使用关键字global&#xff09;和会话…

Shell脚本条件语句

1.条件测试 文件测试与整数测试 test命令 测试表达式是否成立&#xff0c;若成立返回0&#xff0c;不成立返回其他数值 格式1&#xff1a;test 条件表达式 格式2&#xff1a;[ 条件表达式 ] 测试 是否成功使用 $? 操作符&#xff1a; -d&#xff1a;测试是否为目…

JavaWeb学习(1)数据库相关概念,mysql数据库管理系统,SQL语句

数据库相关概念 数据库&#xff1a; 存储数据的仓库&#xff0c;数据是有组织的进行存储 英文&#xff1a;DataBase 简称DB 数据库管理系统&#xff1a; 管理数据库的大型软件 英文&#xff1a;DataBase Management System,简称DBMS SQL 英文&#xff1a;Stry…

Java_方法(重载方法签名等详解)

在之前我们学习C语言时&#xff0c;当我们想要重复使用某段代码的功能时&#xff0c;我们会将这段代码定义为一个函数&#xff0c;而在java中我们把这段重复使用的代码叫做方法。 方法的定义 类体的内容分为变量的声明和方法的定义&#xff0c;方法的定义包括两部分&#xff1…

鱼皮项目_可下载

​ 一、网址 Sign in GitLab 二、登录 以个人邮箱登录 c7 三、下载 四、打开下载文件&#xff0c;后缀zip ​