高精度算法-保姆级讲解

news2024/11/13 10:18:17

目录

1.什么是高精度算法

2.高精度加法 

3.高精度减法

4.高精度乘法 

5.高精度除法 (高精度除以低精度)

6.高精度阶乘(n个低精度数相乘) 


1.什么是高精度算法

高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大无法在计算机中正常存储的数字,将这个数字拆开,拆成一位一位或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。

 (***下面的讲解分布于注释和图片中***)

2.高精度加法 

#include<iostream>
#include<algorithm>
 
using namespace std;
const int N = 1e5 + 10;
 
string s1, s2;
int a[N], b[N], c[N];
 
int main()
{
	cin >> s1 >> s2;
	int j = 1, k = 1;//a、b数组的下标都是从1开始的
	for (int i = s1.size() - 1; i >= 0; i--) a[j++] = s1[i] - '0';//size()函数返回字符串中字符的数量
	//字符串的索引是从0开始,s1.size()计算出字符串s1最后一个字符的索引(倒序输入)
	//size()是std::string类的一个成员函数,用点运算符进行访问
	for (int i = s2.size() - 1; i >= 0; i--) b[k++] = s2[i] - '0';
 
	int ma = max(s1.size(), s2.size());//计算两个输入数字字符串的最大长度ma,确定后续计算的循环次数
	int ans = 0;//用于存储每一位相加时的进位
	for (int i = 1; i <= ma; i++)
	{
		ans = ans + (a[i] + b[i]);
		c[i] = ans % 10;
		ans = ans / 10;
	}
 
	if (ans) c[++ma] = ans;//**一定要注意最高位是否还有进位
	for (int i = ma; i >= 1; i--)//倒序输出
	{
		cout << c[i];
	}
	return 0;
}

3.高精度减法

#include<iostream>
#include<algorithm>
 
using namespace std;
const int N = 1e5 + 10;
 
string s1, s2;
int a[N], b[N], c[N], flag = 0;
 
int main()
{
	cin >> s1 >> s2;
	if (s1.size() < s2.size() || s1.size() == s2.size() && atoi(s1.c_str()) < atoi(s2.c_str()))
	//这个判断是用来s1和s2哪个字符串更大的。atoi(s1.c_str())将s1字符串转化成数字进行比较
	/*
	atoi是 C/C++ 标准库中的一个函数,
	它的全称为 “ASCII to integer”,
	主要功能是将字符串转换为整数。
	这个函数定义在<stdlib.h>头文件中(在 C++ 中也可以使用<cstdlib>)。
	它会扫描字符串参数的起始部分,
	跳过前面的空白字符(如空格、制表符、换行符等),
	直到遇到第一个非空白字符。
	然后,它会尝试将从这个字符开始的连续数字字符序列转换为一个整数。
	如果字符串的第一个非空白字符不是有效的数字字符或者字符串为空,atoi函数会返回 0。
	*/
	/*
	在 C/C++ 中,atoi函数的语法格式为int atoi(const char* str);。
	它接受一个参数str,这个参数是一个指向以'\0'结尾的字符数组(C 风格字符串)的指针。
	函数返回值是转换后的整数。
	*/
	/*
	std::string成员函数c_str()。
	这个函数返回一个指向以'\0'结尾的字符数组(C 风格字符串)的指针,
	这个指针可以作为参数传递给atoi函数。
	*/
	{
		flag = 1;//表示结果为负
		swap(s1, s2);//交换s1,s2,保证s1始终是最大的字符串。
	}
	int j = 1, k = 1;//a,b下标从1开始
	for (int i = s1.size() - 1; i >= 0; i--) a[j++] = s1[i] - '0';
	for (int i = s2.size() - 1; i >= 0; i--) b[k++] = s2[i] - '0';
 
	int ma = max(s1.size(), s2.size());//ma用来存最大长度的字符串个数
	for (int i = 1; i <= ma; i++)
	{
		if (a[i] - b[i] < 0)//需要借位
		{
			a[i] = a[i] + 10;
			a[i + 1] = a[i + 1] - 1;
		}
		c[i] = a[i] - b[i];
	}
	while (c[ma] == 0 && ma > 1) ma--;//前导0的处理,至少保留一位数字
	if (flag == 1) printf("-");//负数的判断
	for (int i = ma; i >= 1; i--)//
	{
		cout << c[i];
	}
	return 0;
}

4.高精度乘法 

#include<iostream>
#include<algorithm>
 
using namespace std;
const int N = 1e6 + 10;
 
string s1, s2;
int a[N], b[N], s[N], c[N];
 
int main()
{
	cin >> s1 >> s2;
	int j = 1, k = 1;
	for (int i = s1.size() - 1; i >= 0; i--) a[j++] = s1[i] - '0';
	for (int i = s2.size() - 1; i >= 0; i--) b[k++] = s2[i] - '0';
 
	for (int i = 1; i <= s1.size(); i++)
	{
		for (int j = 1; j <= s2.size(); j++)
		{
			s[i + j - 1] += a[i] * b[j];//单个数组逐一相乘
		}
	}
	int ma = s1.size() + s2.size() - 1;//记录一下最高位数
	int ans = 0;
	for (int i = 1; i <= ma; i++)//高精度算法的核心
	{
		ans = ans + s[i];
		c[i] = ans % 10;
		ans = ans / 10;
	}
	if (ans) c[++ma] = ans;//考虑进位的情况
	while (c[ma] == 0 && ma > 1) ma--;//前导0的处理
	for (int i = ma; i >= 1; i--)
	{
		cout << c[i];
	}
	return 0;
}

 

5.高精度除法 (高精度除以低精度)

#include<iostream>
#include<algorithm>
 
using namespace std;
const int N = 1e6 + 10;
 
string s1;
int a[N], x, c[N];
 
int main()
{
	cin >> s1 >> x;//x为低精度
	int j = 1;
	for (int i = s1.size() - 1; i >= 0; i--) a[j++] = s1[i] - '0';
 
	int ma = s1.size(), ans = 0;
	for (int i = ma; i >= 1; i--)//除法的核心运算
	{
		ans = ans * 10 + a[i];//上一位数*10加到下一位
		c[i] = ans / x;
		ans = ans % x;
	}
 
	while (c[ma] == 0 && ma > 1) ma--;//前导0的处理
	for (int i = ma; i >= 1; i--)
	{
		cout << c[i];
	}
	cout << endl << ans;//余数的输出
	return 0;
}

 

 

 

6.高精度阶乘(n个低精度数相乘) 

#include<iostream>
#include<algorithm>
#include<cstring>
 
using namespace std;
 
const int N = 1e6 + 10;
int n, a[N], ans, x, m, d;
 
int main()
{
	while (cin >> n)//每次读取一个 n 后,就会计算 n!
	/*
	不断从标准输入读取整数 n,
	直到输入结束
	(例如在终端中使用特定的结束输入方式,
	如在 Windows 下按 Ctrl + Z 然后回车,
	在 Linux 下按 Ctrl + D)
	*/
	{
		a[0] = 1, d = 1;//d用于记录当前存储在 a 数组中的大整数的位数
		for (int i = 1; i <= n; i++)//从1开始一直乘到本数;
		{
			x = 0;//x 用于存储乘法运算中的进位。
			for (int j = 0; j < d; j++)//几位就循环几次
			{
				ans = a[j] * i + x;//每一位乘上i,加上余数后所得的数
				a[j] = ans % 10;//把最后一位给数组,其他的向前进
				x = ans / 10;//把ans的最后一位数去掉
			}
			while (x != 0)//用while把x分配到各个高位,如果 x 不为 0,说明还有进位需要处理
			{
				a[d++] = x % 10;//每进一位位数加一
				x = x / 10;
			}
		}
 
		for (int i = d - 1; i >= 0; i--)
		{
			cout << a[i];//存放从后向前存放,输出就要倒序输出
		}
		cout << endl;
	}
	return 0;
}

***新人博主创作不易,希望大家多多点赞关注呀~ 

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

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

相关文章

vue大疆建图航拍功能实现

介绍 无人机在规划一块区域的时候&#xff0c;我们需要手动的给予一些参数来影响无人机飞行&#xff0c;对于一块地表&#xff0c;无人机每隔N秒在空中间隔的拍照地表的一块区域&#xff0c;在整个任务执行结束后&#xff0c;拍到的所有区域照片能够完整的表达出一块地表&…

learnopencv系列三:GrabCut和DeepLabv3分割模型在文档扫描应用中的实现

文章目录 一、使用OpenCV实现自动文档扫描1.1 图片预处理1.2 查找轮廓1.3 检测角点1.4 仿射变换1.5 Streamlit Web App1.5.1 设置扫描函数和图像下载链接函数1.5.2 streamlit app1.5.3 测试结果 二&#xff1a;DeepLabv3文档分割2.1 项目背景2.2 合成数据集2.2.1 图像收集与预处…

SQLite的BLOB数据类型与C++二进制存储学习记录

一、BLOB数据类型简介 Blob&#xff08;Binary Large Object&#xff09;是一种用于存储二进制数据的数据类型&#xff0c;在数据库中常用于存储图片、音频和视频等大型&#xff08;大数据量&#xff09;的二进制数据[1-2]。需要注意的是&#xff0c;SQLite中BLOB类型的单对象最…

C# 自己编写web服务

文件后缀响应 "text/html"; 文件后缀响应 "application/json"; httpListenerContext.Response.ContentType 文件后缀响应; httpListenerContext.Response.AppendHeader("Access-Control-Allow-Origin", "*"); // L…

微服务day04

网关 网关路由 快速入门 创建新模块&#xff1a;hm-gateway继承hmall父项目。 引入依赖&#xff1a;引入网关依赖和nacos负载均衡的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

Agent框架调研:19种Agent架构对比分析

代理&#xff08;Agent&#xff09;指能自主感知环境并采取行动实现目标的智能体&#xff0c;即AI作为一个人或一个组织的代表&#xff0c;进行某种特定行为和交易&#xff0c;降低一个人或组织的工作复杂程度&#xff0c;减少工作量和沟通成本。 背景 目前&#xff0c;我们在…

ODOO学习笔记(4):Odoo与SAP的主要区别是什么?

Odoo 和 SAP 都是知名的企业资源规划&#xff08;ERP&#xff09;软件&#xff0c;它们之间存在以下一些主要区别&#xff1a; Odoo与SAP的区别 一、功能特点 功能广度 Odoo&#xff1a;提供了一整套全面的业务应用程序&#xff0c;涵盖了销售、采购、库存管理、生产、会计、…

python之正则表达式总结

正则表达式 对于正则表达式的学习&#xff0c;我整理了网上的一些资料&#xff0c;希望可以帮助到各位&#xff01;&#xff01;&#xff01; 我们可以使用正则表达式来定义字符串的匹配模式&#xff0c;即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与…

【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板

文章目录 一、日志框架介绍1、浅谈与slfj4、log4j、logback的关系2、性能方面3、Slf4j使用方法 二、log4j配置三、log4j2配置1、SpringBoot整合Log4j22、非SpringBoot项目引入的依赖3、log4j2-spring.xml文件&#xff08;Spring项目&#xff09;或log4j2.xml&#xff08;非Spri…

StarUML建模工具安装学习与汉化最新零基础详细教程【一键式下载】(适用于Windows、MacOS系统、Linux系统)

StarUML破解安装下载教程 前言&#xff1a; StarUML破解与汉化安装下载教程&#xff0c;仅供学习研究和交流使用&#xff0c;禁止作为商业用途或其他非法用途&#xff01; 仓库作者&#xff1a;X1a0He&#xff0c;经仓库作者授权使用。 目录 StarUML破解安装下载教程1. 下载…

【网络安全】2.3 安全的网络设计_2.防御深度原则

文章目录 一、网络架构二、网络设备三、网络策略四、处理网络安全事件五、实例学习&#xff1a;安全的网络设计结论 网络设计是网络安全的基础&#xff0c;一个好的网络设计可以有效的防止攻击者的入侵。在本篇文章中&#xff0c;我们将详细介绍如何设计一个安全的网络&#…

IoTDB 与 HBase 对比详解:架构、功能与性能

五大方向&#xff0c;洞悉 IoTDB 与 HBase 的详尽对比&#xff01; 在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长&#xff0c;开发者和决策者们需要选择…

如何找到系统中bert-base-uncased默认安装位置

问题&#xff1a; 服务器中无法连接huggingface&#xff0c;故需要自己将模型文件上传 ubuntu 可以按照这个链接下载 Bert下载和使用&#xff08;以bert-base-uncased为例&#xff09; - 会自愈的哈士奇 - 博客园 里面提供了giehub里面的链接 GitHub - google-research/be…

Qt 学习第十六天:文件和事件

一、创建widget对象&#xff08;文件&#xff09; 二、设计ui界面 放一个label标签上去&#xff0c;设置成box就可以显示边框了 三、新建Mylabel类 四、提升ui界面的label标签为Mylabel 五、修改mylabel.h&#xff0c;mylabel.cpp #ifndef MYLABEL_H #define MYLABEL_H#incl…

华为ensp配置bgp(避坑版)

文章目录 前言一、BGP是什么&#xff1f;二、拓扑三、基础配置四、测试五、拓展总结 前言 BGP&#xff08;Border Gateway Protocol&#xff0c;边界网关协议&#xff09;是一种在互联网中使用的路径矢量协议。它主要用于在不同的自治系统&#xff08;AS&#xff09;之间交换路…

QT最新版6.8在线社区版安装教程

访问QT的官网&#xff1a; Qt | Tools for Each Stage of Software Development Lifecycle 点击 Download Try&#xff1a; 点击社区版最新在线安装&#xff1a; 往下翻网页&#xff0c; 点击下载&#xff1a; 开始安装&#xff1a; 使用--mirror进行启动安装程序&#xff1…

鸿蒙多线程开发——Worker多线程

1、概 述 1.1、基本介绍 Worker主要作用是为应用程序提供一个多线程的运行环境&#xff0c;可满足应用程序在执行过程中与主线程分离&#xff0c;在后台线程中运行一个脚本进行耗时操作&#xff0c;极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。 创建Worker的线…

海量数据迁移:Elasticsearch到OpenSearch的无缝迁移策略与实践

文章目录 一&#xff0e;迁移背景二&#xff0e;迁移分析三&#xff0e;方案制定3.1 使用工具迁移3.2 脚本迁移 四&#xff0e;方案建议 一&#xff0e;迁移背景 目前有两个es集群&#xff0c;版本为5.2.2和7.16.0&#xff0c;总数据量为700T。迁移过程需要不停服务迁移&#…

在配置环境变量之后使用Maven报错 : mvn : 无法将“mvn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

最近&#xff0c;我在 Windows 系统上安装和配置 Apache Maven 时遇到了一些问题&#xff0c;想在此记录下我的解决历程&#xff0c;希望对遇到类似问题的朋友有所帮助。 问题描述 我下载了 Maven 并按照常规步骤配置了相关的环境变量。然而&#xff0c;在 PowerShell 中输入…

大模型,智能家居的春秋战国之交

智能家居&#xff0c;大家都不陌生。尽管苹果、谷歌、亚马逊等AI科技巨头&#xff0c;以及传统家电厂商都在积极进入这一领域&#xff0c;但发展了十多年之后&#xff0c;智能家居依然长期呈现出一种技术上人工智障、市场上四分五裂的局面。 究其原因&#xff0c;是此前传统家电…