算法-----高精度算法1(高精度加法,高精度减法)(详解)

什么是高精度算法?

高精度的意思就是他得名字----高的精度,简单说就是位数很大,而高精度算法就是将这些高精度数(位数很大在几百几千几万位的数叫高精度数)通过计算机的型式模拟出来结果。

为什么要用高精度算法?

在这里插入图片描述

我们都知道c++中int的最大值是2^31,unsigned int的最大值是2的32次方,最大的unsigned long long可以到18446744073709551615 。double是浮点型的最大类型,他的最大值是1.7 * 10^308。
这些数据类型对于1+1=2或43545*51345=2235818025这些式子来说绰绰有余,但如果是下面的呢----
153169256934561745635416456903465967693845681963457348+13547477864672672675474676754676783587875372274=? 265464562574318759893457913479346x6524632656224562664=?
3466779657942964574257456/432654724567=?..?
这些式子的数和结果都非常大long long 和 double 都存不下,这时就是要用高精度来计算了

高精度加法

1168:大整数加法
P1601 A+B Problem(高精)
因为不能用计算机直接计算,只能靠模拟。
让我们回顾一下小学一年级时学的加法。

在这里插入图片描述
通过这个竖式我们想想是否可以把高精度加法转换成一道让我们模拟加法竖式的模拟题呢?答案是肯定的
带着这个假想我们可以尝试下
首先初始化
注意!!!:因为位数较大所以我们要用字符串或字符数组

const int N=205;    //定义大小 
string s1,s2;    //俩数 
int a[N],b[N],c[N];   //存放俩数及结果数组 

好了第二步-------读入(read)

void read(){cin>>s1>>s2;
} 

好读入结束,等下,这么草草就结束了a,b数组怎么办。
所以为了照顾a,b数组,我们需要把俩字符串数转成整数数组的型式。
但真的是顺着存储吗?不对
如果顺着存储就是这样
在这里插入图片描述
本来1257+934的式子竟然变了!而且当你好不容易把他变回去时就会发现如果进位时如123+930数组下标竟然需要负数才能存下那个进位的1了!所以顺着存不行,那试试逆序存呢?
大家可以在草稿纸上试试可以发现,逆着存是可以的,也防止了进位溢出的情况
所以,对于存储s1,s2俩数,应用整数数组逆着存。

void read(){cin>>s1>>s2;int len1=s1.size(),len2=s2.size();for(int i=0;i<len1;i++) a[i]=(s1[len1-i-1]-'0');  //逆序存储。需要字符转整数for(int j=0;j<len2;j++) b[j]=(s2[len2-j-1]-'0');
} 

好的终于到模拟部分了
让我们先考虑一下重点
1.考虑进位
2.考虑该进位多少
3.最重要的一点。前导零该怎么办
4.最高位进位
好的一步步来
第一点。因为单个位最大是9,俩9相加才18,进位不可能超1,所以第一部分和第二部分可以同时考虑。如果结果大于10,我们可以将结果-10,或直接不判断直接%10,当然我们也要考虑到当前的i+1位也要+1,所以我们可以用变量来表示这种情况。第三点我们可以从尾开始遍历碰到0就舍去(len-1).如果没碰到就break。第四点我们可以用变量储存模拟完毕后特判下
好分析完毕,代码如下

void count(){int jw=0;len=max(s1.size(),s2.size());   //c的长度是俩数中的最大值或+1for(int i=0;i<len;i++){c[i]=a[i]+b[i]+jw;    //求当前结果jw=c[i]/10;        //进位数c[i]%=10;    //得出当前数} if(jw==1){   //处理最高位进位len++;c[len-1]=1;}while(c[len-1]==0) len--;    //去前导零
}

等下考虑下0+0的结果 ,是空,不是0吗,原来当len==1时就算是0也不能舍去
修改如下

void count(){int jw=0;len=max(s1.size(),s2.size());for(int i=0;i<len;i++){c[i]=a[i]+b[i]+jw;jw=c[i]/10;c[i]%=10;} if(jw==1){len++;c[len-1]=1;}while(len>1&&c[len-1]==0) len--;
}

最后到输出部分了,应为开始时是逆序存所以也要逆序输出正所谓负负得正

void print(){for(int i=len-1;i>=0;i--) cout<<c[i];
}

最后总代如下

#include<bits/stdc++.h>
using namespace std;
const int N=205;     
string s1,s2;  
int a[N],b[N],c[N];  
int len;
void read(){ //读入cin>>s1>>s2;int len1=s1.size(),len2=s2.size();for(int i=0;i<len1;i++) a[i]=(s1[len1-i-1]-'0');for(int j=0;j<len2;j++) b[j]=(s2[len2-j-1]-'0');
} 
void count(){    //模拟竖式int jw=0;len=max(s1.size(),s2.size());for(int i=0;i<len;i++){c[i]=a[i]+b[i]+jw;jw=c[i]/10;c[i]%=10;} if(jw==1){len++;c[len-1]=1;}while(len>1&&c[len-1]==0) len--;
}
void print(){  //输出for(int i=len-1;i>=0;i--) cout<<c[i];
}
int main(){
read();
count();
print();return 0;
}

另外用结构体来计算大整数加法也是常见的,这里不做多说明了与上文类似

#include<bits/stdc++.h>
using namespace std;
string str;
struct node{   //定义int len,s[205];node(){len=0;memset(s,0,sizeof(s));}
};
node a,b,c;
node operator + (const node&a,const node&b){  //重载加法运算符node c;c.len=max(a.len,b.len);for(int i=1;i<=c.len;i++){c.s[i]+=a.s[i]+b.s[i];c.s[i+1]+=c.s[i]/10;c.s[i]%=10;}if(c.s[c.len+1]) c.len++;return c;
}
node read(){   //读入加去前导零cin>>str;int len=str.size();node a;a.len=len;for(int i=0;i<len;i++){a.s[len-i]=str[i]-'0';}while(a.len>1&&a.s[a.len]==0) a.len--;return a;
}void print(node a){//输出for(int i=a.len;i>=1;i--) cout<<a.s[i];
}
int main(){a=read(),b=read();
c=a+b;
print(c);return 0;
}

高精度减法

1169:大整数减法
与高精度加法类似也是模拟
初始化+读入

string s1,s2;
int a[205],b[205],c[205];
int len;
void read(){cin>>s1>>s2;int n=s1.size(),m=s2.size();len=max(n,m);for(int i=0;i<n;i++){a[i]=s1[n-i-1]-'0';}for(int j=0;j<m;j++){b[j]=s2[m-j-1]-'0';}
}

模拟竖式。
这里也有两项需考虑
1.借位
2.去前导零
第二步相信你们很轻松就能解决。而第一步也很简单我们正常减,如果c[i]<0,那么需要借位了有加就有减,所以c[i]+=10;c[i+1]–;
代码如下

void less(){for(int i=0;i<len;i++){c[i]+=a[i]-b[i];if(c[i]<0){c[i]+=10;c[i+1]--;}}while(len>1&&c[len-1]==0) len--;
}

最后逆序输出

void print(){for(int i=len-1;i>=0;i--) cout<<c[i];
}

总代码

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[205],b[205],c[205];
int len;
void read(){cin>>s1>>s2;int n=s1.size(),m=s2.size();len=max(n,m);for(int i=0;i<n;i++){a[i]=s1[n-i-1]-'0';}for(int j=0;j<m;j++){b[j]=s2[m-j-1]-'0';}
}
void lss(){for(int i=0;i<len;i++){c[i]+=a[i]-b[i];if(c[i]<0){c[i]+=10;c[i+1]--;}}while(len>1&&c[len-1]==0) len--;
}
void print(){for(int i=len-1;i>=0;i--) cout<<c[i];
}
int main(){
read();
lss();
print();return 0;
}

这边结构体减法代码就不放了,有兴趣可以自己做下。
总结下来,只要会高精度加法就会高精度减法。

未完待续。。。。。。

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

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

相关文章

C# 【WPF】之 INotifyPropertyChanged的简单封装

以下是一个简单的 INotifyPropertyChanged 封装示例&#xff1a; using System.ComponentModel; c#兼职Q群&#xff1a;741058172 public class ObservableObject : INotifyPropertyChanged {public event PropertyChangedEventHandler PropertyChanged;protected void RaiseP…

C语言—字符数组(3)

可能不是那么的完整&#xff0c;先凑合看吧&#xff0c;如果我学会如何修改以后&#xff0c;我慢慢回来修改的 1.编写程序实现对两个字符串的连接功能&#xff1b; 法一:不使用strcat函数,写程序直接实现&#xff0c;记得添加结束符&#xff0c;不然程序访问数组时候将变得不…

Kafka 之消费者(Consumer)

目录 一. 前言 二. 消费示例 2.1. 自动提交偏移量&#xff08;Automatic Offset Committing&#xff09; 2.2. 手动控制偏移量&#xff08;Manual Offset Control&#xff09; 2.3. 订阅指定的分区&#xff08;Manual Partition Assignment&#xff09; 三. 消费核心说明…

【教程】C++语言基础学习笔记(八)——函数

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【C语言基础学习】系列文章 第一章 《项目与程序结构》 第二章 《数据类型》 第三章 《运算符》 第四章 《流程控制》 第五章…

叙事弧基础

原文&#xff1a;MasterClass. 2020. Learn About Narrative Arcs: Definition, Examples, and How to Create a Narrative Arc in Your Writing - 2021. https://www.masterclass.com/articles/what-are-the-elements-of-a-narrative-arc-and-how-do-you-create-one-in-writin…

Day50- 单调栈part01

一、每日温度 题目一&#xff1a;739. 每日温度 739. 每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升…

耳机壳UV树脂制作私模定制耳塞需要哪些工具和材料呢?

制作私模定制耳塞需要使用到一些工具和材料&#xff0c;包括但不限于以下内容&#xff1a; UV树脂&#xff1a;用于制作耳塞的主体部分&#xff0c;具有高硬度、耐磨、耐高温、环保等优点。耳模材料&#xff1a;用于获取用户的耳型&#xff0c;通常是一些快速固化的材料&#…

1185. 单词游戏(欧拉路径)

活动 - AcWing 有 N 个盘子&#xff0c;每个盘子上写着一个仅由小写字母组成的英文单词。 你需要给这些盘子安排一个合适的顺序&#xff0c;使得相邻两个盘子中&#xff0c;前一个盘子上单词的末字母等于后一个盘子上单词的首字母。 请你编写一个程序&#xff0c;判断是否能…

LeetCode 0987.二叉树的垂序遍历:遍历时存节点信息,遍历完自定义排序

【LetMeFly】987.二叉树的垂序遍历&#xff1a;遍历时存节点信息&#xff0c;遍历完自定义排序 力扣题目链接&#xff1a;https://leetcode.cn/problems/vertical-order-traversal-of-a-binary-tree/ 给你二叉树的根结点 root &#xff0c;请你设计算法计算二叉树的 垂序遍历…

【AutoGen】多个AI代理协同工作

【AutoGen】多个AI代理协同工作 Autogen是一个卓越的人工智能系统&#xff0c;它可以创建多个人工智能代理&#xff0c;这些代理能够协作完成任务&#xff0c;包括自动生成代码&#xff0c;并有效地执行任务。 这个框架主要解决的是在开发此类复杂应用程序时&#xff0c;工作…

2024/2/13 图的基础知识 3(拓扑排序)

目录 最长路 P1807 最长路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Divide by three, multiply by two Problem - 977D - Codeforces 最长路 P1807 最长路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a;使用拓扑排序&#xff0c;开两个二维数组…

局部加权回归

局部加权回归&#xff08;Local Weighted Regression&#xff09;是一种非参数回归方法&#xff0c;用于解决线性回归模型无法很好拟合非线性数据的问题。它通过给不同的样本赋予不同的权重&#xff0c;使得在拟合模型时更加关注靠近目标点附近的样本数据。 局部加权回归的基本…

【C语言】【力扣】7.整数反转和9.回文数

一、整数反转 1.1 个人思考过程 初解&#xff1a;出现ERROR&#xff0c;数据溢出的情况下应该返回0。&#xff08;错误&#xff09; int reverse(int x){int y0;while(x!0){yy*10x%10;x/10; }return y; } 再解&#xff1a;加上数据溢出判断条件。&#xff08;正确&#…

寒假学习记录14:JS字符串

目录 查找字符串中的特定元素 String.indexOf() &#xff08;返回索引值&#xff09; 截取字符串的一部分 .substring() &#xff08;不影响原数组&#xff09;&#xff08;不允许负值&#xff09; 截取字符串的一部分 .slice() &#xff08;不影响原数…

拥抱Java 21—— main 函数精简和未命名模式的变化

Java 21 已经在2023年9月19日正式发布了。Java 21是最新的LTS&#xff08;Long Time Support&#xff09;版本&#xff0c;因此还没发布时就引起了许多开发人员的关注。此次版本升级&#xff0c;一共有 15 个功能进行了更新。 在这 15 个功能更新中&#xff0c;有类似于 ZGC、…

“bound drug/molecule”or “unbound drug/molecule”、molecule shape、sketching是什么?

“bound drug/molecule”or “unbound drug/molecule” For clarity, the following terms will be used throughout this study: “bound drug/molecule” (or “unbound drug/molecule”) refers to the drug/molecule that is bound (or unbound) to proteins [48]. 意思就是…

【C语言】简易英语词典

文章目录 一、定义英语单词信息的结构体二、主函数功能逻辑三、查单词函数四、背单词函数五、补充 一、定义英语单词信息的结构体 添加必要的头文件、宏定义和声明&#xff0c;之后定义英语单词信息结构体。 /* 头文件和宏定义 */ #include <stdio.h> #include <std…

Java实现快乐贩卖馆管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视频收藏模块2.4 视频评分模块2.5 视频交易模块2.6 视频好友模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 搞笑视频表3.2.2 视频收藏表3.2.3 视频评分表3.2.4 视频交易表 四、系…

【前沿技术杂谈:AI 模型训练成本】到 2030 年,AI 模型训练成本预计将从 1 亿美元增加到 5 亿美元

【前沿技术杂谈&#xff1a;AI 模型训练成本】到 2030 年&#xff0c;AI 模型训练成本预计将从 1 亿美元增加到 5 亿美元 简述五年后&#xff0c;人工智能将掌握在谁的手中&#xff1f; 简述 根据 OpenAI 最近的一份报告&#xff0c;到 2030 年&#xff0c;训练大型 AI 模型的成…

AutoSAR(基础入门篇)8.6-实验:配置I/O

注意: 本次实验是接着上一次实验做的,大家应该要养成一个良好的习惯就是备份工程。比如我们现在是接着上次做的,但是最好在开始前将之前的工程备 份一遍,以防止出错重来。当然,最好的方法还是使用Git管理。还有一点要说明的是:很多之前实验中出现过的操作我们不再重复展…