高精度算法(1)

前言

今天来讲一讲高精度算法,我们说一个数据类型,有它的对应范围比如int类型最多

可以包含到负2的31次方到2的31次方减一

其实大概就是20亿左右那么其他的类型也同样如此

那么,如何解决一个很大很大的数的运算呢?

我们今天介绍两种对于整数的高精度加法和高精度除法

还算是比较简单的算法,但实现起来仍然有细节

高精度加法

对于两个很大很大的数,我们已经无法用任何整型来记录它更不能对其运算,那么此时我们完全可以使用字符串来记录要进行加法的数

我们以题目为例

输入两个数 a b    0<a<^{}10^{500}   0<b<^{}10^{500} ,求两个数之和,这里的数为整数

思路

使用字符串记录两个数,当然这个字符串的大小范围取决于数的范围10^{500}最多有500位数

(不包括10^{500}) 那么字符数组大小只要大于500就可以了

把它用字符数组记住后该数的高位对应字符数组低下标

所以我们需要逆转这个字符数组,并让它储存在整型数组中,最后让这个个数所对应的

相加,满10进1,就完成了.

当然这两个操作数都是正数,那如果有负数,怎么办那么我们可以把它当成减法嘛

思路是如此实现起来还有很多细节,会在代码中注释出来的,好好看,可以看懂的

看代码吧

//高精度算法
char a[505];
char b[505];
int a1[505];
int b1[505];
int result[505];
int main()
{printf("请输入两个数\n");scanf("%s", a);scanf("%s", b);int lc, la, lb;la = strlen(a);lb = strlen(b);//遇10进1,有可能位数是a b 中最大的或者是最大的加上1//所以在这里默认使位数加一,后面可以判断是否有改位lc = la > lb ? la + 1 : lb + 1;//逆置字符串,方便运算,毕竟要从低位开始算,//把低位放在低下标处for (int i = 0; i <la; i++){a1[la-i-1] = a[i] - '0';}for (int i = 0; i < lb; i++){b1[lb-i-1] = b[i] - '0';}for (int i = 0; i < lc; i++){result[i]+=a1[i] + b1[i];result[i + 1] += result[i]/10;result[i]%=10;}//但是这里值的注意的是//对于加法最多会多一个前置0//判断并清除前置0if(result[lc]==0)lc--;for (int i = lc - 1; i >= 0; i--){printf("%d", result[i]);}return 0;
}

一些细节全部都在代码的注释上了

当然 我们其实完全可以不构建太多变量,来实现优化

说一说思路,但是这个代码写起来就会变得难理解了

我们完全可以只构建两个char arr[]   char brr[] 数组

然后直接把他们逆置,通过brr[]字符数组先可以去一个字符0在加到字符arr[]中如果大于字符‘9’+1

所对应的Ascll值就可以让和减去数字10,让下一位加数字1这样也可以解决问题

最后通过判断长度以及清除前置的‘0’来输出结果

不过没有太大必要 代码都差不多,就这么点空间,其实区别不大

好吧!我们看看测试的结果

左边是测试值右边是执行代码的结果 两者一样 nice!那么该程序就是可以计算更高精度的整数

高精度减法

高精度减法的思路与加法差不多

但是要多出一个判断,我们就用大或等的数减去小的数,得到一个非负数,最后再判断是否要添加负号

核心思路就是低位减去低位,若大数的低位小于小数的低位,那么低位向高位借一位

看个例题

计算最大10000位的正数之间的减法

多说无益 代码走起

//高精度减法
char s1[10090];
char s2[10090];
char s3[10090];
int a[10090];
int b[10090];
int c[10090];
bool flag;
bool cmpare(char *p1,char* p2)
{int lp1= strlen(p1);int lp2 = strlen(p2);if (lp1 > lp2)return true;else if (lp1 == lp2){if (strcmp(p1, p2) >= 0)return true;elsereturn false;}elsereturn false;
}
int main()
{while (1){printf("请输入被减数与减数\n");scanf("%s", s1);scanf("%s", s2);if (!cmpare(s1, s2)){flag = true;strcpy(s3, s1);strcpy(s1, s2);strcpy(s2, s3);}int la = strlen(s1);int lb = strlen(s2);int lc = la > lb ? la : lb;//逆置字符数组for (int i = 0; i < la; i++){a[la - i] = s1[i] - '0';}for (int i = 0; i < lb; i++){b[lb - i] = s2[i] - '0';}for (int i = 1; i <= lc; i++){if (a[i] < b[i]){a[i + 1]--;a[i] += 10;}c[i] = a[i] - b[i];}//清除前置0,如果两个数相等,我们就要清除位数-1个0//举例100-100=000 我们要清除这两个三位数的两个0//这里要用循环来解决while (c[lc] == 0 && lc > 1)lc--;//判断正负if (flag){printf("-");flag = false;}for (int i = lc; i >0; i--)printf("%d", c[i]);printf("\n");}return 0;
}

看看代码吧

细节还是很多的,值得注意的·

1就是那么前置0的清除

2还有就是a b整型数组是从1开始的

3ic的大小至少为1

还是那样,今天就这样了,继续努力

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

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

相关文章

OSPF综合大实验

1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&#xff0c;其他路由器均有一个环…

局域网管理软件,适合在局域网内的管理软件有哪些?

信息技术的不断发展&#xff0c;局域网在企业、学校等机构中得到了广泛应用。 局域网不仅能够提高数据传输效率&#xff0c;还能实现资源共享和协同工作。 为了更好地管理和维护局域网&#xff0c;需要使用一些专业的局域网管理软件。 一、局域网的应用范围 局域网&#xff…

【算法一则】分隔链表

题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x …

做一个图像分类任务(一)准备数据集

文章目录 环境准备准备数据集爬取数据代码删除多余的文件fruit81水果数据图像分类数据集下载统计图像的尺寸和比例分布代码划分训练集和数据集代码可视化图像代码统计各类别的数量 环境准备 推荐按照原作者推荐的环境&#xff1a;代码测试云GPU环境&#xff1a;GPU RTX 3060、…

如何安全、高速、有效地利用IP代理爬取数据

陈老老老板&#x1f9d9;‍♂️ &#x1f46e;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f934;本文简述&#xff1a;如何安全、高速、有效地利用IP代理爬取数据 &#x1f473…

多模态AnyGPT——整合图像、语音和文本多模态大规模语言模型算法原理与实践

概述 大规模语言模型在理解和生成人类语言方面具有非凡的能力&#xff0c;但迄今为止&#xff0c;它们的能力主要局限于文本处理。然而&#xff0c;现实世界是一个多模式的环境&#xff0c;信息通过视觉、听觉和触觉等多种感官进行交换。融入这种多样性是开发下一代系统的主要…

云原生Kubernetes: K8S 1.29版本 部署Jenkins

目录 一、实验 1.环境 2.K8S 1.29版本 部署Jenkins 服务 3.jenkins安装Kubernetes插件 二、问题 1.创建pod失败 2.journalctl如何查看日志信息 2.容器内如何查询jenkins初始密码 3.jenkins离线安装中文包报错 4.jenkins插件报错 一、实验 1.环境 &#xff08;1&…

上位机图像处理和嵌入式模块部署(树莓派4b固件功能设计)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;上位机的功能都是基于插件进行开发的。但是上位机的成本比较贵&#xff0c;一般的企业不一定愿意接接受。这个时候另外一…

【第三版 系统集成项目管理工程师】 十五至尊图

持续更新。。。。。。。。。。。。。。。 【第三版】十五至尊图 十五至尊图【必会】1.整合&#xff08;7&#xff09;2.范围 &#xff08;6&#xff09;3.进度 &#xff08;6&#xff09;4.成本 &#xff08;4&#xff09;5.质量&#xff08;3&#xff09;6.资源&#xff08;6&…

【LeetCode: 3117. 划分数组得到最小的值之和 + 动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Jmeter 测试Dubbo接口-实例

1、Dubbo插件准备 ①把jmeter-plugins-dubbo-2.7.4.1-jar-with-dependencies.jar包放在D:\apache-jmeter-5.5\lib\ext目录 ②重新打开Jmeter客户端 在线程组-添加-取样器-dubbo simple&#xff0c;添加dubbo接口请求 2、Jmeter测试lottery接口 ①配置zookeeper参数 由于dub…

【蓝桥杯嵌入式】蓝桥杯嵌入式第十四届省赛程序真题,真题分析与代码讲解

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都已更新完毕&#xff0c;欢迎大家前往订阅本专题&#x1f38f; &#x1f38f;【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 &#x1f38f;【蓝桥杯嵌入式】蓝桥…

在PostgreSQL中如何处理大对象(Large Objects),例如存储和检索二进制文件?

文章目录 存储二进制文件为大对象步骤 1&#xff1a;创建一个大对象步骤 2&#xff1a;写入数据到大对象 检索大对象为二进制文件步骤 1&#xff1a;打开大对象以进行读取步骤 2&#xff1a;从大对象读取数据 注意事项 PostgreSQL 提供了对大对象&#xff08;Large Objects&…

2024蓝桥杯省赛C++软件算法研究生组题解(含代码)+游记

A题 给你一个音游的游戏记录log.txt&#xff0c;判断玩家的最高连击数 题解 水题&#xff0c;但是要小心&#xff0c;miss的键需要重置k0&#xff0c;超时但正确的键重置k1 个人答案是9 代码&#xff1a; #include<cstdio> #include<cstring> #include<al…

高可用集群——keepalived

目录 1 高可用的概念 2 心跳监测与漂移 IP 地址 3 Keepalived服务介绍 4 Keepalived故障切换转移原理介绍 5 Keepalived 实现 Nginx 的高可用集群 5.1 项目背景 5.2 项目环境 5.3 项目部署 5.3.1 web01\web02配置&#xff1a; 5.3.2nginx负载均衡配置 5.3.3 主调度服…

[lesson43]继承的概念和意义

继承的概念和意义 类之间的组合关系 组合关系的特点 将其他类的对象作为当前类的成员使用当前类的对象与成员对象的生命期相同成员对象在用法上与普通对象完全一致 惊艳的继承 面相对象中的继承指类之间的父子关系 子类拥有父类的所有属性和行为子类就是一种特殊的父类子类…

【C语言】每日一题,快速提升(7)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;X图形 示例&#xff1a; 输入&#xff1a; 5 //几行数输出&#xff1a; …

日志情况分析

日志是用来记录信息的&#xff0c;更多是方便于查看各种出错信息。时间、日志等级、日志内容、文件名称已经行号都会显示出来&#xff01;日志等级是什么&#xff1f;就是当出问题时&#xff0c;根据问题成都列出等级 Info:常规消息 Debug&#xff1a;t调试信息 Waring:报警信息…

单臂路由实验

单臂路由是一种在单个物理接口上配置多个逻辑接口&#xff0c;以实现不同VLAN间通信的技术。它通过在路由器接口上划分子接口&#xff0c;每个子接口对应一个VLAN网段&#xff0c;从而实现了VLAN间的互联互通。单臂路由能够重新封装MAC地址&#xff0c;转换VLAN标签&#xff0c…

基于51单片机的简单风扇控制设计—调速、摇头

基于51单片机的风扇控制设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.步进电机模拟风速、摇头 2.按键可以控制风速、摇头&#xff1b; 3.数码管显示风速档位&#xff1b; 4.LED作摇头提示灯…