当前位置: 首页 > article >正文

C++高精度算法的简单实现

一、基本原理1、存储方式采用数字记录高精度数字数组的第一个元素存储数据长度比如记录数字为1024示例如下2、计算方式采用模拟立竖式计算比如加法的计算流程如下图所示10249000这里只给出加法的计算说明其他的以此类推减法与加法基本一致。乘法和除法略有不同通过示例图表示也复杂还不如通过代码去理解本质的方法就是模拟笔算的立竖式计算。二、辅助方法1、字符串转高精度长度记录在数组第一个元素中123456789101112/// summary/// 通过字符串初始化/// /summary/// param namea[in]高精度数组/param/// param namevalue[in]字符串首地址/paramstaticvoidloadStr(int* a,constchar* value){//记录长度a[0] strlen(value);for(inti 1; i a[0]; i)a[i] value[a[0] - i] -0;}2、整型转高精度12345678910111213141516171819/// summary/// 通过无符号整型初始化/// /summary/// param namea[in]高精度数组/param/// param namevalue[in]整型值/paramstaticvoidloadInt(int* a, uint64_t value){for(size_ti 1; i 8096; i){a[i] value % 10;value / 10;if(!value){//记录长度a[0] i;return;}}}3、比较123456789101112131415/// summary/// 比较两个高精度数的大小/// /summary/// param namea[in]第一个数/param/// param nameb[in]第二个数/param/// returns1是ab,0是ab,-1是ab/returnsstaticintcompare(int* a,int* b){if(a[0] b[0])return1;if(a[0] b[0])return-1;for(inti a[0]; i 0; i--)if(a[i] b[i])return1;elseif(a[i] b[i])return-1;return0;}4、打印123456789/// summary/// 打印输出结果/// /summarystaticvoidprint(int* a) {if(!a[0])printf(0);for(inti a[0]; i 0; i--)printf(%d, a[i]);}三、算法实现原理就不做具体介绍了四种计算的核心都是模拟立竖式计算。1、加法为了保证代码相对简单当b长度较小时可能会做一些多余的计算不影响结果。123456789101112131415161718/// summary/// 加法(累加)///结果会保存在a中/// /summary/// param namea[in]被加数/param/// param nameb[in]加数/paramstaticvoidacc(int* a,int* b){intlen a[0] b[0] ? a[0] : b[0];memset(a a[0] 1, 0, (len - a[0] 1) *sizeof(int));memset(b b[0] 1, 0, (len - b[0] 1) *sizeof(int));for(inti 1; i len; i) {inttemp a[i] b[i];a[i] temp % 10;a[i 1] temp / 10;}if(a[len 1])a[0];}2、减法12345678910111213141516171819202122232425262728/// summary/// 减法(累减)///结果会保存在a中/// /summary/// param namea[in]被减数被减数必须大于等于减数/param/// param nameb[in]减数/paramstaticvoidsubc(int* a,int* b) {memset(b b[0] 1, 0, (a[0] - b[0]) *sizeof(int));for(inti 1; i a[0]; i){inttemp a[i] - b[i];a[i] temp;if(temp 0){//借位a[i 1] - 1;a[i] 10;}}//记录长度for(inti a[0]; i 0; i--)if(a[i]){a[0] i;return;}a[0] 0;}3、乘法123456789101112131415161718192021222324252627282930313233/// summary/// 乘法/// /summary/// param namea[in]被乘数/param/// param nameb[in]乘数/param/// param namec[out]结果数组长度必须大于等于aLenbLen1/paramstaticvoidmul(int* a,int* b,intc[]) {c[a[0] b[0]] 0;memset(c, 0,sizeof(int) * (a[0] b[0] 1));for(inti 1; i a[0]; i){intj;intd 0;//被乘数的一位去乘以乘数的每一位for(j 1; j b[0]; j){inttemp a[i] * b[j] c[j i - 1] d;c[j i - 1] temp % 10;d temp / 10;}if(d){c[j i - 1] d;}}//记录长度for(inti a[0] b[0]; i 0; i--)if(c[i]){c[0] i;return;}}4、除法采用了升阶减法实现123456789101112131415161718192021222324252627282930313233343536/// summary/// 除法/// 依赖减法subc/// /summary/// param namea[in]被除数,被除数必须大于除数/param/// param nameb[in]除数/param/// param namec[out]商数组长度大于等于aLen-bLen1/param/// param namemod[out]余数数组长度大于等于aLen/param/// param nametemp[in]临时缓冲区由外部提供以提高性能数组长度大于等于aLen-bLen1/paramstaticvoiddivi(int* a,int* b,int* c,int* mod,int* temp) {//相差的阶数intdigit a[0] - b[0] 1;memcpy(mod, a, (a[0] 1) *sizeof(int));memset(c, 0,sizeof(int) * (digit 1));memset(temp, 0,sizeof(int) * digit);while(digit){//升阶memcpy(temp digit, b 1,sizeof(int) * b[0]);temp[0] b[0] digit - 1;//减法while(compare(mod, temp) ! -1){subc(mod, temp);c[digit];}digit--;}//记录长度for(inti a[0] - b[0] 1; i 0; i--)if(c[i]){c[0] i;return;}}四、使用示例1、加法计算累加1234567891011121314intmain() {int64_t n;intnum[1024];intnum2[1024];std::cin n;loadInt(num, 0);for(int64_t i 1; i n; i){loadInt(num2, i);acc(num, num2);}print(num);return0;}结果2、减法两个任意n位数的减法数字1大于数字2。1234567891011intmain(){inta1[8096], a2[8096];std::string s1, s2;std::cin s1 s2;loadStr(a1, s1.c_str());loadStr(a2, s2.c_str());subc(a1, a2);print(a1);return0;}结果#数字1752425289999999999999652142141414141414146666676667677682324000001302461646520#数字2587891851201874512000000000154515100202121555555555555555555555545477910232111#计算结果1645334387981254879996521419868990412120251111211121221267684444558245514144093、乘法计算阶乘1234567891011121314151617181920intmain() {int64_t n;intnum[8192];intnum2[8192];intnum3[8192];int* p1 num;int* p2 num3;std::cin n;loadInt(num, 1);for(int64_t i 1; i n; i){loadInt(num2, i);mul(p1, num2, p2);int* temp p1;p1 p2;p2 temp;}print(p1);return0;}

相关文章:

C++高精度算法的简单实现

一、基本原理1、存储方式采用数字记录高精度数字,数组的第一个元素存储数据长度,比如记录数字为1024示例如下:2、计算方式采用模拟立竖式计算,比如加法的计算流程,如下图所示10249000:这里只给出加法的计算…...

让macOS窗口切换像Windows一样高效:alt-tab-macos完全指南

让macOS窗口切换像Windows一样高效:alt-tab-macos完全指南 【免费下载链接】alt-tab-macos Windows alt-tab on macOS 项目地址: https://gitcode.com/gh_mirrors/al/alt-tab-macos 你是否曾经在macOS上怀念Windows的alttab快捷键?是否觉得macOS…...

【小白适用】2026 最新 Win11 OpenClaw 一键安装步骤(包含安装包)

OpenClaw(小龙虾)Windows 11 一键部署教程|2026 最新版|零代码・免配置・解压即用 适用系统:Windows 11 专业版 / 家庭版 / 正式版(全版本兼容)项目介绍:OpenClaw 是 GitHub 星标 2…...

【最新版本】OpenClaw 2.7.5 一键安装部署完整教程(包含安装包)

OpenClaw 一键安装包|一键部署,告别复杂环境配置 适配系统:Windows10/11 64 位当前版本:v2.7.5(虾壳云版)核心优势:全程可视化操作,无需命令行、无需手动配置 Python/Node.js&#…...

AI编码助手安全规则实战:为Cursor定制安全防线,防范硬编码与注入风险

1. 项目概述:当AI编码助手遇上安全红线最近在GitHub上看到一个挺有意思的项目,叫“Deadly244/cursor-security-rules”。光看名字,你可能会觉得这又是一个关于网络安全或代码审计的工具。但点进去仔细一看,发现它的定位非常精准且…...

AI黑魔法实战:LLM应用性能优化与成本控制高级技巧

1. 项目概述:当AI遇上“黑魔法”最近在GitHub上闲逛,发现了一个名为“lvcn/ai-black-magic”的项目,这个名字本身就充满了吸引力。对于任何在AI领域摸爬滚打过的开发者来说,“黑魔法”这个词往往意味着那些不按常理出牌、却能解决…...

简单认识显卡

学习视频来自B站(从零开始认识显卡):https://www.bilibili.com/video/BV1xE421j7Uv 这是你最近在玩的电脑游戏,形态各异的建筑、细节丰富的车辆,一切都很真实,它们的本质其实是一个个不同位置的点&#xff…...

LLM实战指南:从Transformer原理到微调部署的完整学习路径

1. 项目概述:一个面向实践者的LLM学习路线图最近在GitHub上看到一个叫mlabonne/llm-course的项目,热度非常高。点进去一看,这其实不是一个传统意义上的“课程”,而更像一份由社区驱动的、持续更新的“大型语言模型实战指南”。它的…...

Python网络爬虫框架xcapy实战:任务驱动与反爬对抗

1. 项目概述:一个为现代应用量身定制的网络抓取框架最近在做一个需要大规模、高频率抓取网页数据的项目,传统的爬虫框架用起来总觉得有点“水土不服”。要么是异步处理不够优雅,遇到复杂的反爬策略就手忙脚乱;要么是配置过于繁琐&…...

构建个人效率工具集:模块化Shell环境配置与自动化工作流实践

1. 项目概述与核心价值最近在整理个人技术栈和自动化工具时,发现了一个挺有意思的项目,叫“Tsai1030/Tsai_PIG”。乍一看这个仓库名,可能会让人有点摸不着头脑,PIG?和数据处理框架Apache Pig有关吗?还是某种…...

如何用Project Graph快速构建思维导图?终极跨平台节点图绘制指南

如何用Project Graph快速构建思维导图?终极跨平台节点图绘制指南 【免费下载链接】project-graph A node-based visual tool for organizing thoughts and notes in a non-linear way. 项目地址: https://gitcode.com/gh_mirrors/pr/project-graph 还在为项目…...

人工智能领域SCI期刊征稿|中科院2区为主,录用率80%+,对国人极度友好,避坑必看,自引率安全、投稿零压力,审稿高效、录用率拉满,毕业 / 评职必看!

对于AI、计算机视觉、神经网络、计算智能领域的科研人(硕博、青年教师、工程师)而言,发表SCI核心需求是「分区稳、录用易、对国人友好、无预警风险」。本文整理4本人工智能领域优质SCI期刊,涵盖中科院2区(4本&#xff…...

JavaScript 数据可视化:从原理到实战(附代码)

尽管 Python 的 Matplotlib 和 Seaborn 在数据科学领域占据主导,但JavaScript 可视化 是构建交互式、可嵌入网页的应用级图表和仪表盘的唯一标准。 它允许开发者创建动态、可响应的可视化效果,并直接部署于浏览器环境,这是静态图片无法比拟的…...

基于BLE MIDI的智能木琴:用Arduino与电磁铁桥接物理乐器与数字音频工作站

1. 项目概述:当传统木琴遇见现代数字音乐如果你和我一样,既着迷于传统打击乐器那清脆、富有共鸣的物理音色,又离不开现代数字音频工作站(DAW)那强大的创作和编辑能力,那么“如何将两者无缝桥接”可能一直是…...

别再让电池充不满!用CN3791芯片设计太阳能充电电路,这几个调试坑我帮你踩了

太阳能充电电路实战:CN3791芯片调试避坑指南 当阳光洒在太阳能板上,理论上我们应该获得源源不断的清洁能源。但现实往往比理想骨感得多——尤其当你发现精心设计的CN3791充电电路始终无法将锂电池充满时。这不是芯片的错,而是我们在参数设置和…...

Linux内核驱动开发:从传统proc接口到现代seq_file与proc_ops的迁移指南

1. 项目概述:为什么我们需要关注/proc的新接口?如果你在Linux内核驱动开发领域摸爬滚打过几年,一定对/proc文件系统这个“老伙计”又爱又恨。爱它,是因为在调试和状态监控时,它提供了一个极其简单、直观的窗口&#xf…...

使用Taotoken后API调用延迟与稳定性体感观察报告

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken后API调用延迟与稳定性体感观察报告 1. 引言:从直接对接模型到使用聚合平台 在开发基于大语言模型的应用…...

3步掌握SMUDebugTool:AMD Ryzen处理器调试完全指南

3步掌握SMUDebugTool:AMD Ryzen处理器调试完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitco…...

从PyAutoGUI到OpenClaw:构建健壮桌面自动化的状态驱动技能库

1. 项目概述:当自动化脚本拥有“鹰爪”最近在GitHub上看到一个挺有意思的项目,叫Ikaros-521/openclaw-pyautogui-skill。光看名字,就透着一股“硬核”和“实用”的气息。Ikaros(伊卡洛斯)是希腊神话里那位用蜡和羽毛造…...

linux内核源码内存管理(7)

一、 引言:冲破冯诺依曼瓶颈的壁障在传统的单处理器(UMA,Uniform Memory Access)架构中,所有CPU核心通过同一条总线平等地访问所有内存。这种对称性带来了编程模型的简洁,但也埋下了致命的可扩展性陷阱&…...

AMD Ryzen处理器底层调试技术解析:SMUDebugTool的架构设计与实践应用

AMD Ryzen处理器底层调试技术解析:SMUDebugTool的架构设计与实践应用 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地…...

Python 开发者三步接入 Taotoken 调用 GPT 与 Claude 模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Python 开发者三步接入 Taotoken 调用 GPT 与 Claude 模型 对于习惯使用 OpenAI 官方 Python SDK 的开发者来说,接入 T…...

【亲测有效】DeepSeek极简入门与应用_156.[第6章 高级应用技巧] 场景描述型框架:用情境设定让AI进入最佳状态

别再让AI"猜谜"了!一个场景设定,让DeepSeek从"人工智障"秒变"懂王"——这可能是你用过最被低估的Prompt技巧 #mermaid-svg-7MQcGN4wm4OXCgus{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:1…...

apk 包管理器完全指南:Alpine Linux 的轻量级利器

一、apk 体系架构全景 apk(Alpine Package Keeper)是 Alpine Linux 的核心包管理工具,与 Debian 的 APT 相比,它遵循极简主义设计哲学:代码量少、依赖解析简单、资源占用极低。这使得 Alpine 成为 Docker 容器的默认基…...

黑苹果配置神器Hackintool:从新手到高手的完整指南

黑苹果配置神器Hackintool:从新手到高手的完整指南 【免费下载链接】Hackintool The Swiss army knife of vanilla Hackintoshing 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintool Hackintool被誉为"黑苹果瑞士军刀",是配置和…...

ThinkPad风扇控制终极指南:TPFanCtrl2让笔记本更安静高效

ThinkPad风扇控制终极指南:TPFanCtrl2让笔记本更安静高效 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否经常被ThinkPad风扇的噪音打扰?…...

网安工具系列python系列【仅供参考】:Python实战:利用fofa API高效搜索网络资产

Python实战:利用fofa API高效搜索网络资产 Python实战:利用fofa API高效搜索网络资产 1. 从零开始:为什么你需要一个自动化的资产搜索工具? 2. 动手前的准备:你的fofa账户和Python环境 2.1 获取你的fofa API凭证 2.2 搭建Python脚本环境 3. 核心代码拆解:一行行理解搜索脚…...

移动篇:WMS里的“乾坤大挪移”——移库、补货、冻结全解析

WMS里的“乾坤大挪移”——移库、补货、冻结全解析 摘要:货物入库后,不是“一放了之”。库位要优化、库存要周转、临期品要管理……这就涉及WMS中的“库存移动”操作。移库、补货、冻结分别解决什么问题?什么场景下会用到?本文带你…...

出库篇:仓库里的货往哪去?——WMS出库方式全解析,物流新人必读

仓库里的货往哪去?——WMS出库方式全解析,物流新人必读 摘要:货品有进必有出。上一期我们聊了WMS中货品的四大来源(采购、生产、退货、调拨入库),这一期我们来看看货品是怎么“出”去的——销售出库、采购退…...

入库篇:仓库里的货从哪来?——WMS货品来源全解析,物流新人必读

仓库里的货从哪来?——WMS货品来源全解析,物流新人必读 摘要:每天在WMS系统里看到成百上千的库存记录,但你想过没有——这些货品最初是怎么进入系统的?是采购进来的?生产出来的?客户退回来的&am…...