C++高精度算法详解:实现超大整数运算

devtools/2025/3/10 22:51:46/

一、高精度算法概述

在C++编程中,int型(-2147483648 ~ 2147483647)和long long型(-9223372036854775808~9223372036854775807)的数值范围有限。当处理超过19位的整数(如30位或200位的数字)时,常规数据类型无法存储,必须采用字符串输入+数组存储的方式处理,这种技术称为高精度算法

二、高精度加法实现

核心步骤:

  1. 字符串转数字数组并逆序存储(低位对齐)

  2. 逐位相加并处理进位

  3. 去除前导零并输出结果

string A, B;
int a[40] = {0}, b[40] = {0}, sum[40] = {0};
cin >> A >> B; // 输入样例:1234567890314 5890235578899// 字符串逆序转数字数组
int lenA = A.length();
for (int i = 0; i < lenA; i++) {a[lenA - i - 1] = A[i] - '0';
}
int lenB = B.length();
for (int i = 0; i < lenB; i++) {b[lenB - i - 1] = B[i] - '0';
}// 逐位相加
int c = 0, lenS = 0; // 进位、结果长度
while (lenS < lenA || lenS < lenB) {sum[lenS] = (a[lenS] + b[lenS] + c) % 10;c = (a[lenS] + b[lenS] + c) / 10;lenS++;
}
sum[lenS] = c; // 处理最高位进位// 输出结果(去除前导零)
if (c == 0) lenS--;
for (int i = lenS; i >= 0; i--) {cout << sum[i]; // 输出样例:1234573469213
}

三、高精度减法实现

核心步骤:

  1. 比较大小确定符号

  2. 逆序存储并处理借位

  3. 去除前导零并输出符号

string A, B;
int a[200] = {0}, b[200] = {0}, sub[200] = {0};
cin >> A >> B; // 输入样例:9999999999 9999999999999999999988// 比较大小确定符号
int sign = 1;
if (A.length() < B.length() || (A.length() == B.length() && A < B)) {sign = -1;swap(A, B);
}// 逆序转数组
int lenA = A.length();
for (int i = 0; i < lenA; i++) {a[lenA - i - 1] = A[i] - '0';
}
int lenB = B.length();
for (int i = 0; i < lenB; i++) {b[lenB - i - 1] = B[i] - '0';
}// 逐位相减
int lenS = 0;
while (lenS < lenA || lenS < lenB) {if (a[lenS] < b[lenS]) {a[lenS] += 10;a[lenS + 1]--;}sub[lenS] = a[lenS] - b[lenS];lenS++;
}// 输出结果
if (sign == -1) cout << '-';
while (lenS > 0 && sub[lenS] == 0) lenS--; // 去除前导零
for (int i = lenS; i >= 0; i--) {cout << sub[i]; // 输出样例:-9999999999989999999989
}

四、高精度乘法实现

核心步骤:

  1. 双循环逐位相乘

  2. 累加结果并处理进位

  3. 去除前导零

string A, B;
int a[104] = {0}, b[104] = {0}, m[204] = {0};
cin >> A >> B; // 输入样例:864 132// 逆序转数组
int lenA = A.length();
for (int i = 0; i < lenA; i++) {a[lenA - i - 1] = A[i] - '0';
}
int lenB = B.length();
for (int i = 0; i < lenB; i++) {b[lenB - i - 1] = B[i] - '0';
}// 逐位相乘累加
for (int j = 0; j < lenB; j++) {int c = 0; // 进位for (int i = 0; i < lenA; i++) {m[i + j] += a[i] * b[j] + c;c = m[i + j] / 10;m[i + j] %= 10;}m[j + lenA] = c; // 处理最高位进位
}// 输出结果
int len = lenA + lenB;
while (len > 0 && m[len] == 0) len--; // 去除前导零
for (int i = len; i >= 0; i--) {cout << m[i]; // 输出样例:114048
}

五、算法总结

运算类型关键处理时间复杂度
加法进位处理、逆序对齐O(n)
减法借位处理、符号判断O(n)
乘法双重循环累加O(n²)

掌握高精度算法后,可处理任意长度整数运算,适用于密码学、大数据分析等领域。实际开发中需注意内存分配优化运算效率提升


http://www.ppmy.cn/devtools/166125.html

相关文章

php虚拟站点提示No input file specified时的问题及权限处理方法

访问站点&#xff0c;提示如下 No input file specified. 可能是文件权限有问题&#xff0c;也可能是“.user.ini”文件路径没有配置对&#xff0c;最简单的办法就是直接将它删除掉&#xff0c;还有就是将它设置正确 #配置成自己服务器上正确的路径 open_basedir/mnt/qiy/te…

数巅科技携手智慧足迹深耕行业大模型应用

近日&#xff0c;数巅科技与智慧足迹数据科技有限公司&#xff08;智慧足迹&#xff09;达成战略合作&#xff0c;双方将联合开展AI大模型应用研发&#xff0c;提供定制化行业解决方案&#xff0c;以技术创新推动AI大模型应用创新&#xff0c;助力企业数智化转型。 智慧足迹拥有…

基坑气膜:工地升级新科技,打造绿色施工新标杆—轻空间

传统工地扬尘严重&#xff0c;影响周边环境和施工安全&#xff0c;而基坑气膜凭借全封闭式覆盖&#xff0c;彻底解决扬尘问题。PM2.5实时监测系统可精准掌控空气质量&#xff0c;并联动自动喷淋系统&#xff0c;高效抑尘&#xff0c;使防尘率突破92%&#xff0c;真正做到“工地…

Mac安装jdk教程

在Mac上安装JDK&#xff08;Java Development Kit&#xff09;的步骤如下&#xff1a; 一、下载JDK安装包 访问Oracle官网&#xff1a; 打开浏览器&#xff0c;访问Oracle JDK下载页面。 选择JDK版本&#xff1a; 根据你的开发需求选择合适的JDK版本。例如&#xff0c;JDK 11…

【每日学点HarmonyOS Next知识】对话框去掉圆角、数组拼接、自定义对话框依附某个控件、平移动画、页面栈管理

1、 HarmonyOS CustomDialog怎么去掉左右和底部的透明以及圆角&#xff1f; CustomDialog怎么去掉左右和底部的透明以及圆角 设置customStyle为true即可开启使用自定义样式。设置borderRadius为0去掉圆角属性。 属性用法参考文档&#xff1a;https://developer.huawei.com/c…

Java TCP 通信:实现简单的 Echo 服务器与客户端

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输层协议。与 UDP 不同&#xff0c;TCP 保证了数据的顺序、可靠性和完整性&#xff0c;适用于需要可靠传输的应用场景&#xff0c;如文件传输、网页浏览等。本文将基于 Java 实现一个简单的…

如何在语言模型的参数中封装知识?——以T5模型为例

【摘要】 这篇论文探讨了大型语言模型在无需外部知识的情况下&#xff0c;能否通过预训练来存储和检索知识以回答开放领域的问题。作者通过微调预训练模型来回答问题&#xff0c;而这些模型在训练时并未提供任何额外的知识或上下文。这种方法随着模型规模的增加而表现出良好的…

RHCE9.0版本笔记5:防火墙的本地/远程登录方式

一、防火墙登录方式全景图 华为防火墙支持多种管理访问方式&#xff0c;根据安全等级和场景需求可分为&#xff1a; graph LR A[管理方式] --> B[本地登录] A --> C[远程登录] B --> B1(Console) B --> B2(Web) C --> C1(SSH) C --> C2(Telnet) C --> C…