高精算法的用法及其优势
高精度问题是指当数据的位数非常大(超出标准数据类型的范围)时,如何进行计算和存储的问题。常见场景包括大整数的加、减、乘、除、取模等操作。以下是解决高精度问题的常用方法与技巧:
一、数据存储
- 数组存储
- 用整型数组存储,每个元素存一位数字。例如,数字12345可存为(a[]={5,4,3,2,1})(逆序存储方便计算)。
- 字符串存储
- 用字符数组(char[])存储数字,每个字符表示一位数字。如数字12345可存为(char s[] = "12345")。
二、基本操作
- 高精度加法
- 思路
- 从低位到高位逐位相加并处理进位。
- 代码实现
void add(int a[], int b[], int c[], int len) {int carry = 0;for (int i = 0; i < len; i++) {c[i] = a[i] + b[i] + carry;carry = c[i]/10;c[i] %= 10;}if (carry) {c[len]=carry;} }
- 思路
- 高精度减法
- 思路
- 从低位到高位逐位相减并处理借位,要确保被减数大于减数,否则结果为负。
- 代码实现
void subtract(int a[], int b[], int c[], int len) {int borrow = 0;for (int i = 0; i < len; i++) {c[i] = a[i]-b[i]-borrow;if (c[i]<0) {c[i]+=10;borrow = 1;} else {borrow = 0;}} }
- 思路
- 高精度乘法
- 思路
- 模拟竖式乘法,逐位相乘并累加结果。
- 代码实现
void multiply(int a[], int b[], int c[], int lenA, int lenB) {for (int i = 0; i < lenA; i++) {for (int j = 0; j < lenB; j++) {c[i + j]+=a[i]*b[j];c[i + j + 1]+=c[i + j]/10;c[i + j]%=10;}} }
- 思路
- 高精度除法
- 思路
- 模拟竖式除法,逐位试商。
- 代码实现
void divide(int a[], int b, int c[], int len) {int remainder = 0;for (int i = len - 1; i >= 0; i--) {int temp = remainder * 10 + a[i];c[i]=temp/b;remainder = temp%b;} }
- 思路
三、优化技巧
- 压位存储
- 每个数组元素存储多位数字(如4位或9位),减少数组长度与计算次数。例如,数字123456789可存为(a[] = {6789,12345})(每4位一组)。
- 快速乘法
- 可用Karatsuba算法或FFT(快速傅里叶变换)优化高精度乘法。
- 预处理和缓存
- 对重复计算的高精度问题,可预处理结果并缓存。
四、代码示例:高精度加法
- 代码如下
#include <stdio.h> #include <string.h>#define MAX_LEN 1000// 反转字符串 void reverseString(char *str, int len) {int i = 0, j = len - 1;while (i < j) {char temp = str[i];str[i]=str[j];str[j]=temp;i++;j--;} }// 高精度加法 void add(char *a, char *b, char *result) {int lenA = strlen(a);int lenB = strlen(b);reverseString(a, lenA);reverseString(b, lenB);int carry = 0;int i;for (i = 0; i < lenA || i < lenB; i++) {int digitA=(i < lenA)?(a[i]-'0'):0;int digitB=(i < lenB)?(b[i]-'0'):0;int sum = digitA + digitB + carry;result[i]=(sum%10)+'0';carry = sum/10;}if (carry) {result[i]=carry+'0';i++;}result[i]='\0';reverseString(result, i); }int main() {char a[MAX_LEN], b[MAX_LEN], result[MAX_LEN + 1];printf("输入第一个数: ");scanf("%s", a);printf("输入第二个数: ");scanf("%s", b);add(a, b, result);printf("结果: %s\n", result);return 0; }
五、常见问题
- 边界情况
- 要处理前导零、负数、空输入等特殊情况。
- 性能问题
- 对于大数据,优化算法和存储方式。
六、总结
高精度问题核心是模拟手工计算过程,用数组或字符串存储数据,逐位处理进位、借位等操作。掌握基本操作后可进一步优化算法性能。
使用数组或字符串存储高精度数据,每个元素表示一位数字,具备以下优势:
一、突破标准数据类型的限制
- 标准数据类型的局限
- 标准数据类型如
int、long long有固定的位数限制。例如,int通常只能表示约(2^{31}-1)(约21亿),long long只能表示约(2^{63}-1)(约9亿亿),无法表示非常大的数字。
- 标准数据类型如
- 数组或字符串的优势
- 数组或字符串能够存储任意长度的数字,不受标准数据类型位数的限制。
二、灵活性高
- 标准数据类型的问题
- 标准数据类型的位数固定,不能动态调整。
- 数组或字符串的优势
- 数组或字符串的长度可按需动态调整,能适应不同规模的数据处理需求。
三、便于逐位操作
- 标准数据类型的不足
- 标准数据类型无法直接访问每一位数字。
- 数组或字符串的优势
- 数组或字符串可以轻松对每一位数字进行访问和操作,这对于模拟手工计算过程(如逐位相加、相乘等)非常有利。
四、易于实现高精度运算
- 标准数据类型运算的局限
- 标准数据类型的运算(如加法、乘法)无法直接处理高精度数据。
- 数组或字符串的优势
- 数组或字符串便于实现高精度运算:
- 加法:可逐位相加并处理进位。
- 乘法:能够逐位相乘并累加结果。
- 除法:可以逐位试商。
- 数组或字符串便于实现高精度运算:
五、兼容字符串输入输出
- 标准数据类型的输入输出问题
- 标准数据类型无法直接处理超长数字的输入输出。
- 数组或字符串的优势
- 数组或字符串可直接存储用户输入的超长数字,并且方便输出结果。
六、节省空间
- 标准数据类型的空间浪费问题
- 若用标准数据类型存储每一位数字,会造成大量空间浪费。
- 数组或字符串的优势
- 数组或字符串能紧凑地存储每一位数字,从而节省空间。
七、支持负数和小数
- 标准数据类型对负数和小数处理的局限
- 标准数据类型对负数和小数的处理能力有限。
- 数组或字符串的优势
- 数组或字符串可灵活表示负数和小数:
- 负数:可在数组或字符串中增加符号位。
- 小数:能在数组或字符串中标记小数点位置。
- 数组或字符串可灵活表示负数和小数:
八、示例对比
- 标准数据类型的限制示例
long long a = 1234567890123456789; // 超出 long long 的范围 long long b = 9876543210987654321; long long c = a + b; // 错误:结果溢出 - 数组或字符串的优势示例
char a[] = "1234567890123456789"; char b[] = "9876543210987654321"; char result[100]; add(a, b, result); // 正确:结果存储在 result 中
九、总结
使用数组或字符串存储高精度数据主要有以下优势:
- 突破标准数据类型的位数限制。
- 灵活处理不同规模的数据。
- 方便逐位操作,适合模拟手工计算。
- 易于实现高精度运算。
- 兼容字符串输入输出。
- 节省存储空间。
- 支持负数和小数。
这些优势使数组或字符串成为解决高精度问题的理想之选。
相关文章:
高精算法的用法及其优势
高精度问题是指当数据的位数非常大(超出标准数据类型的范围)时,如何进行计算和存储的问题。常见场景包括大整数的加、减、乘、除、取模等操作。以下是解决高精度问题的常用方法与技巧: 一、数据存储 数组存储 用整型数组存储&am…...
【Spring AOP】_切点类的切点表达式
目录 1. 根据方法签名匹配编写切点表达式 1.1 具体语法 1.2 通配符表达规范 2. 根据注解匹配编写切点表达式 2.1 实现步骤 2.2 元注解及其常用取值含义 2.3 使用自定义注解 2.3.1 编写自定义注解MyAspect 2.3.2 编写切面类MyAspectDemo 2.3.3 编写测试类及测试方法 在…...
多线程-定时任务线程池源码
定时任务线程池 ScheduledThreadPoolExecutor,可以执行定时任务的线程池。这里学习它的基本原理。 定时任务线程池,和普通线程池不同的地方在于,它使用一个延迟队列,延迟队列使用最小堆作为它的数据结构,它会按照任务…...
初次使用 IDE 搭配 Lombok 注解的配置
前言 在 Java 开发的漫漫征程中,我们总会遇到各种提升效率的工具。Lombok 便是其中一款能让代码编写变得更加简洁高效的神奇库。它通过注解的方式,巧妙地在编译阶段为我们生成那些繁琐的样板代码,比如 getter、setter、构造函数等。然而&…...
云服数据存储接口:CloudSever
云服数据存储接口:CloudSever 迷你世界 更新时间: 2024-04-28 19:09:10 具体函数名及描述如下: 序号 函数名 函数描述 1 setOrderDataBykey(...) 设置排行榜中指定键的数值 2 removeOrderDataByKey(...) 删除排行榜中指定键的数值 …...
关于 QPalette设置按钮背景未显示出来 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/146047054 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
上传文件到对象存储是选择前端还是后端
对于云上对象存储的上传方式选择(前端直传或后端代理上传),需综合考虑安全性、性能、成本、业务需求等因素。 1. 推荐前端直传的场景 适用条件: 大文件上传(如视频、大型数据集)高并发场景(如…...
mysql下载与安装
一、mysql下载: MySQL获取: 官网:www.mysql.com 也可以从Oracle官方进入:https://www.oracle.com/ 下载地址:https://downloads.mysql.com/archives/community/ 选择对应的版本和对应的操作系统ÿ…...
Python练习(握手问题,进制转换,日期问题,位运算,求和)
一. 握手问题 代码实现 ans0for i in range(1,51):for j in range(i1,51):if i<7 and j<7:continueelse:ans 1print(ans) 这道题可以看成是50个人都握了手减去7个人没握手的次数 答案:1204 二.将十进制整数拆解 2.1门牌制作 代码实现 ans0for i in ra…...
小程序分类页面
1创建cate分支 2.cate滑动界面布局 获取滑动界面高度 3.获取并渲染一级分类的列表数据 4.渲染二级和三级分类列表 获取二级列表的数据 5.渲染二级分类列表的UI结构 6.动态渲染三级分类列表...
HTML + CSS 题目
1.说说你对盒子模型的理解? 一、是什么 对一个文档进行布局的时候,浏览器渲染引擎会根据标准之一的css基础盒模型,将所有元素表示为一个个矩形的盒子。 一个盒子由四个部分组成: content,padding,border,margin 下…...
计算机视觉|ViT详解:打破视觉与语言界限
一、ViT 的诞生背景 在计算机视觉领域的发展中,卷积神经网络(CNN)一直占据重要地位。自 2012 年 AlexNet 在 ImageNet 大赛中取得优异成绩后,CNN 在图像分类任务中显示出强大能力。随后,VGG、ResNet 等深度网络架构不…...
Node JS 调用模型Xenova_all-MiniLM-L6-v2实战
本篇通过将句子数组转换为句子的向量表示,并通过平均池化和归一化处理,生成适合机器学习或深度学习任务使用的特征向量为例,演示通过NodeJS 的方式调用Xenova/all-MiniLM-L6-v2 的过程。 关于 all-MiniLM-L6-v2 的介绍,可以参照上…...
React + TypeScript 实战指南:用类型守护你的组件
TypeScript 为 React 开发带来了强大的类型安全保障,这里解析常见的一些TS写法: 一、组件基础类型 1. 函数组件定义 // 显式声明 Props 类型并标注返回值 interface WelcomeProps {name: string;age?: number; // 可选属性 }const Welcome: React.FC…...
ASP.NET Core JWT认证与授权
1.JWT结构 JSON Web Token(JWT)是一种用于在网络应用之间安全传输声明的开放标准(RFC 7519)。它通常由三部分组成,以紧凑的字符串形式表示,在身份验证、信息交换等场景中广泛应用。 2.JWT权限认证 2.1添…...
【车规芯片】如何引导时钟树生长方向
12nm车规DFTAPR项目中,我们可以看到,绝大部分的sink都受控于xxxx_tessent_occ_clk_cpu_inst/tessent_persistent_cell_clock_out_mux/C10_ctmi_1这个mux,这是我们DFT设计结果: 这里我们重新打开place的数据 Anchor,也就…...
突破传统:用Polars解锁ICU医疗数据分析新范式
一、ICU数据革命的临界点 在重症监护室(ICU),每秒都在产生关乎生死的关键数据:从持续监测的生命体征到高频更新的实验室指标,从呼吸机参数到血管活性药物剂量,现代ICU每天产生的数据量级已突破TB级别。传统…...
《深度学习实战》第11集:AI大模型压缩与加速
深度学习实战 | 第11集:AI大模型压缩与加速 在深度学习领域,随着模型规模的不断增大,模型的推理速度和部署效率成为实际应用中的关键挑战。本篇博客将带你深入了解模型压缩与加速的核心技术,并通过一个实战项目展示如何使用知识蒸…...
golang进阶知识专项-理解值传递
在 Go 语言中,所有函数的参数传递都是值传递(Pass by Value)。当你将一个变量作为参数传递给函数时,实际上传递的是该变量的副本,而不是变量本身。理解这一点对于避免常见的编程错误至关重要。根据不同的类型ÿ…...
OCPP与ISO 15118集成:实现即插即充与车网互动(V2G)- 慧知开源充电桩平台
OCPP与ISO 15118集成:实现即插即充与车网互动(V2G) 引言 随着电动汽车(EV)与电网双向能量交互(V2G)技术的成熟,OCPP协议与ISO 15118标准的协同成为智能充电基础设施的核心挑战。本文…...
大语言模型中温度参数(Temperature)的核心原理
大语言模型中温度参数(Temperature)的核心原理是通过调整模型输出的概率分布,控制生成结果的随机性和多样性。以下是其原理的详细说明: 一、定义与核心作用 温度参数是生成式模型(如GPT系列)中的一个超参数…...
K8s控制器Deployment详解
回顾 ReplicaSet 控制器,该控制器是用来维护集群中运行的 Pod 数量的,但是往往在实际操作的时候,我们反而不会去直接使用 RS,而是会使用更上层的控制器,比如说 Deployment。 Deployment 一个非常重要的功能就是实现了 Pod 的滚动…...
鸿蒙HarmonyOS评论功能小demo
评论页面小demo 效果展示 1.拆解组件,分层搭建 我们将整个评论页面拆解为三个组件,分别是头部导航,评论项,回复三个部分,然后统一在index界面导入 2.头部导航界面搭建 Preview Component struct HmNavBar {// 属性&a…...
基于PyTorch的深度学习3——基于autograd的反向传播
反向传播,可以理解为函数关系的反向传播。...
日期格式与字符串不匹配bug
异常特征:java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String ### Error updating database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.Str…...
打印三角形及Debug
打印三角形及Debug package struct; public class TestDemo01 {public static void main(String[] args) {//打印三角形 五行 for (int i 1; i < 5; i) {for (int j 5 ; j >i; j--) {System.out.print(" ");}for (int k1;k<i;k) {System.out.print(&…...
大语言模型揭秘:从诞生到智能
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)无疑是技术领域最耀眼的明星之一。它们不仅能够理解人类的自然语言,还能生成流畅的文本,甚至在对话、翻译、创作等任务中表现出接近人类的智能…...
Collab-Overcooked:专注于多智能体协作的语言模型基准测试平台
2025-02-27,由北京邮电大学和理想汽车公司联合创建。该平台基于《Overcooked-AI》游戏环境,设计了更具挑战性和实用性的交互任务,目的通过自然语言沟通促进多智能体协作。 一、研究背景 近年来,基于大型语言模型的智能体系统在复…...
SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试(WebSocket连接模式)
文章目录 前言正文一、项目环境二、项目代码2.1 pom.xml2.2 DeepSeekController.java2.3 启动类2.4 logback-spring.xml2.5 application.yaml2.6 WebsocketConfig.java2.7 AiChatWebSocketHandler.java2.8 SaveChatSessionParamRequest.java2.9 index.html 三、页面调试3.1 主页…...
LINUX网络基础 [一] - 初识网络,理解网络协议
目录 前言 一. 计算机网络背景 1.1 发展历程 1.1.1 独立模式 1.1.2 网络互联 1.1.3 局域网LAN 1.1.4 广域网WAN 1.2 总结 二. "协议" 2.1 什么是协议 2.2 网络协议的理解 2.3 网络协议的分层结构 三. OSI七层模型(理论标准) …...
