GESP5级语法知识(十一):高精度算法(一)

news2025/4/22 0:13:33

高精度加法:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int N=501;//高精度数的最长长度
//c[]=a[]+b[]:高精度加法方案一:对应位相加,同时处理进位
void h_add_1(int a[],int b[],int c[]) 
{
	int la=a[0]	;
	int lb=b[0];
	int lc=max(la,lb);
	int x=0; //进位
	for(int i=1;i<=lc;i++) 
	{
		c[i]=a[i]+b[i]+x;
		x=c[i]/10;
		c[i]%=10;
	}
	//处理最高进位
	if(x>0) 
	{
		lc++;
		c[lc]=x;
	}
	c[0]=lc;
}
//c[]=a[]+b[]:高精度加法方案二:先对应位相加,然后处理进位。 
 void h_add_2(int a[],int b[],int c[]) 
 {
 	int la=a[0]	;
 	int lb=b[0];
 	int lc=max(la,lb);
 	//对应位相加 
	for(int i=1;i<=lc;i++) 
	{
		c[i]=a[i]+b[i];
	}
	//处理进位
	 for(int i=1;i<=lc;i++) 
	{
		c[i+1]+=c[i]/10;
		c[i]%=10;
	}
	c[0]=(c[lc+1]!=0)? (lc+1):lc;
 }
 //把字符串转换成按位表示的整型数组
 int convert(string s,int n[]) 
 {
 	int length=s.length();
 	//将数串s转换为 数组n[] ,并倒序存储
	for(int i=1;i<=length;i++) 
	{
		n[i]=s[length-i]-'0';
	}
	//n[0]存储位数 
	n[0]=length;
	return length;
 }
 //删除先导0;修正位数 
 int trim(int n[])
 {
 	int length=n[0];
 	for(int i=n[0];i>=0;i--)
 	{
	 	//找到不是0的最高位 
	 	if(n[i]!=0)
	 	{
		 	length=i;
		 	break;
		}
	 }
	 n[0]=length;
	 return length;
 }
 void output(int n[])
 {
 	int length=n[0];
 	//0需要特别处理
	if(length==0) 
	{
		cout<<0<<endl;
		return ;
	}
	//从高位向低位输出 
	for(int i=length;i>=1;i--)
	{
		cout<<n[i];
	}
	cout<<endl;
 }
 int a[N+1];  //第一个加数 
 int b[N+1];  //第二个加数 
 int c1[N+2]; //方法一计算结果 
 int c2[N+2]; //方法二计算结果
 int main() 
 {
 	string s1,s2;
 	cin>>s1>>s2;
 	convert(s1,a);
 	convert(s2,b);
 	//方案一
	h_add_1(a,b,c1);
	trim(c1) ;
	output(c1);
	//方案二
	h_add_2(a,b,c2) ;
	trim(c2);
	output(c2);
	
	return 0;
	
 }

高精度减法:

#include<iostream>
#include<string>     //C++string类
#include<algorithm>
using namespace std;
const int N=10001;//高精度数的最长长度
//c[]=a[]-b[]:高精度减法方案一:对应位相减,同时处理借位
void h_minus_1(int a[],int b[],int c[]) 
{
	
	int lc=c[0]=a[0];
	int q=0; //借位 
	for(int i=1;i<=lc;i++) 
	{
		//对应位相减,并减去上一位的借位 
		c[i]=a[i]-b[i]-q;
		if(c[i]<0) //不够减就借位 
		{
			c[i]+=10;
			q=1; 
		}
		else q=0;
	}
	
}
//c[]=a[]-b[]:高精度减法方案二:先对应位相减,然后处理进位。 
 void h_minus_2(int a[],int b[],int c[]) 
 {
 	int lc=c[0]=a[0];
 	//对应位相减
	for(int i=1;i<=lc;i++) 
	{
		c[i]=a[i]-b[i];
	}
	//处理借位
	for(int i=1;i<=lc;i++) 
	{
		if(c[i]<0)
		{
			//计算借位数字为负数
			int k=(c[i]%10)?(c[i]/10-1):c[i]/10;
			c[i+1]+=k;  //高位
			c[i]-=10*k;  //当前位 	
		}
	} 
 }
 //比较高精度数字的大小,a>b为1, a<b为-1, a=b为0 
 int compare(int a[],int b[])
  {
  	//a的位数大于b,则a比b大
 	 if(a[0]>b[0]) 
 	 {
 	 	return 1;
 	 }
 	//a的位数小于b,则a比b小 
 	 if(a[0]<b[0]) 
 		 {
 		 	return -1;
 		 }
 	int la=a[0];
 	for(int i=la;i>0;i--)
 	{
 		if(a[i]>b[i])
 		{
 			return 1;
 		}
 		if(a[i]<b[i])
 		{
 			return -1;
 		}
 	}
 	return 0;
  }
 //把字符串转换成按位表示的整型数组
 int convert(string s,int n[]) 
 {
 	int length=s.length();
 	//将数串s转换为 数组n[] ,并倒序存储
	for(int i=1;i<=length;i++) 
	{
		n[i]=s[length-i]-'0';
	}
	//n[0]存储位数 
	n[0]=length;
	return length;
 }
 //删除先导0;修正位数 
 int trim(int n[])
 {
 	int length=n[0];
 	for(int i=n[0];i>=0;i--)
 	{
	 	//找到不是0的最高位 
	 	if(n[i]!=0)
	 	{
		 	length=i;
		 	break;
		}
	 }
	 n[0]=length;
	 return length;
 }
 //输出高精度数据 
 void output(int n[])
 {
 	int length=n[0];
 	//0需要特别处理
	if(length==0) 
	{
		cout<<0<<endl;
		return ;
	}
	//从高位向低位输出 
	for(int i=length;i>=1;i--)
	{
		cout<<n[i];
	}
	cout<<endl;
 }
 int a[N+1];  //被减数 
 int b[N+1];  //减数
 int c1[N+2]; //方法一计算结果 
 int c2[N+2]; //方法二计算结果
 int main() 
 {
 	string s1,s2;
 	cin>>s1>>s2;
 	convert(s1,a);
 	convert(s2,b);
 	//比较被减数与减数
	int sign=compare(a,b) ;
	if(sign<0)
	{
		swap(a,b);
	}
 	//方案一
	h_minus_1(a,b,c1);
	trim(c1) ;
	if(sign<0)
	{
		cout<<"-";
	}
	output(c1);
	
	//方案二
	h_minus_2(a,b,c2) ;
	trim(c2);
	if(sign<0)
	{
		cout<<"-";
	}
	output(c2);
	return 0;
 }
 

高精度数的比较:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int N=501;//高精度数的最长长度


 int convert(string s,int n[]) 
 {
 	int length=s.length();
 	//将数串s转换为 数组n[] ,并倒序存储
	for(int i=1;i<=length;i++) 
	{
		n[i]=s[length-i]-'0';
	}
	//n[0]存储位数 
	n[0]=length;
	return length;
 }
 //删除先导0;修正位数 
 int trim(int n[])
 {
 	int length=n[0];
 	for(int i=n[0];i>=0;i--)
 	{
	 	//找到不是0的最高位 
	 	if(n[i]!=0)
	 	{
		 	length=i;
		 	break;
		}
	 }
	 n[0]=length;
	 return length;
 }
 int compare(int a[],int b[])
 {
 	//a的位数大于b,则a比b大
	 if(a[0]>b[0]) 
	 {
	 	return 1;
	 }
	//a的位数小于b,则a比b小 
	 if(a[0]<b[0]) 
		 {
		 	return -1;
		 }
	int la=a[0];
	for(int i=la;i>0;i--)
	{
		if(a[i]>b[i])
		{
			return 1;
		}
		if(a[i]<b[i])
		{
			return -1;
		}
	}
	return 0;
 }

 int a[N+1];  
 int b[N+1];
 int main() 
 {
 	string s1,s2;
 	cin>>s1>>s2;
 	convert(s1,a);
 	convert(s2,b);
	trim(a);
	trim(b);
	cout<<compare(a,b)<<endl;
	
	return 0;
	
 }

高精度数的存储与存储:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int N=501;//高精度数的最长长度


 int convert(string s,int n[]) 
 {
 	int length=s.length();
 	//将数串s转换为 数组n[] ,并倒序存储
	for(int i=1;i<=length;i++) 
	{
		n[i]=s[length-i]-'0';
	}
	//n[0]存储位数 
	n[0]=length;
	return length;
 }
 //删除先导0;修正位数 
 int trim(int n[])
 {
 	int length=n[0];
 	for(int i=n[0];i>=0;i--)
 	{
	 	//找到不是0的最高位 
	 	if(n[i]!=0)
	 	{
		 	length=i;
		 	break;
		}
	 }
	 n[0]=length;
	 return length;
 }
 void output(int n[])
 {
 	int length=n[0];
 	//0需要特别处理
	if(length==0) 
	{
		cout<<0<<endl;
		return ;
	}
	//从高位向低位输出 
	for(int i=length;i>=1;i--)
	{
		cout<<n[i];
	}
	cout<<endl;
 }
 int a[N+1];  //第一个加数 
 
 int main() 
 {
 	string s1;
 	cin>>s1;
 	convert(s1,a);
	trim(a);
	output(a);
	
	return 0;
	
 }

2的乘方(高精度)

#include<iostream>
int a[100001];
using namespace std;
int main()
{
	int n,i,j,x,len=1;  //len=1,位数初始化为1 
	cin>>n;
	a[1]=1;             //得数初始化为1 
	for(i=1;i<=n;i++)   //计算n次 
	{
		x=0;            //x表示进位,初始化为0 
		for(j=1;j<=len;j++)
		{
			a[j]=a[j]*2+x;//得数每一位都*2,再加进位 
			x=a[j]/10;    //计算进位
			a[j] %=10;    //保留个位数
			if(x!=0&&j==len) len++;   //计算到最高位,并且有进位,长度加1 
		}
	} 
	for(i=len;i>=1;i--) 
		cout<<a[i];
	return 0;
}

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

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

相关文章

【前端】 react项目使用bootstrap、useRef和useState之间的区别和应用

一、场景描述 我想写一个轮播图的程序&#xff0c;只是把bootstrap里面的轮播图拉过来就用上感觉不是很合适&#xff0c;然后我就想自己写自动轮播&#xff0c;因此&#xff0c;这篇文章里面只是自动轮播的部分&#xff0c;没有按键跟自动轮播的衔接部分。 Ps: 本文用的是函数…

PYYAML反序列化详解

前言 最近看了很多pyyaml反序列化的漏洞利用&#xff0c;但是对漏洞怎么来的&#xff0c;没有进行很详细的分析&#xff0c;所以今天刚好学习一下反序列化的原理 Yaml基本语法 一个 .yml 文件中可以有多份配置文件&#xff0c;用 --- 隔开即可对大小写敏感YAML 中的值&#x…

LeeCode题库第十八题

项目场景&#xff1a; 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&…

Zookeeper 和 Redis 哪种更好?

目录 前言 &#xff1a; 什么是Zookeeper 和 Redis &#xff1f; 1. 核心定位与功能 2. 关键差异点 (1) 一致性模型 (2) 性能 (3) 数据容量 (4) 高可用性 3. 适用场景 使用 Zookeeper 的场景 使用 Redis 的场景 4. 替代方案 5. 如何选择&#xff1f; 6. 常见误区 7. 总结 前言…

公然上线传销项目,Web3 的底线已经被无限突破

作者&#xff1a;Techub 热点速递 撰文&#xff1a;Yangz&#xff0c;Techub News 今天早些时候&#xff0c;OKX 将上线 PI 的消息在圈内引起轩然大波&#xff0c;对于上线被板上钉钉为传销盘子的「项目」 &#xff0c;Techub News 联系了 OKX 公关&#xff0c;但对方拒绝置评…

C语言第18节:自定义类型——联合和枚举

1. 联合体 C语言中的联合体&#xff08;Union&#xff09;是一种数据结构&#xff0c;它允许在同一内存位置存储不同类型的数据。不同于结构体&#xff08;struct&#xff09;&#xff0c;结构体的成员各自占有独立的内存空间&#xff0c;而联合体的所有成员共享同一块内存区域…

解锁网络安全:穿越数字世界的防护密码

个人主页&#xff1a;java之路-CSDN博客(期待您的关注) 目录 网络安全&#xff1a;数字时代的基石 网络安全面面观 &#xff08;一&#xff09;定义与范畴 &#xff08;二&#xff09;发展历程 网络安全面临的威胁 &#xff08;一&#xff09;恶意软件肆虐 &#xff08;二…

python爬虫解决无限debugger问题

方法一 关闭定时任务 关闭断点执行代码打开断点 # 无限debugger产生原因 # 1. web开发者工具打开 # 2. js代码中有debugger # 3. js有定时处理[推荐] for(let i0;i<99999;i){window.clearInterval(i)}方法二 关闭breakpoint 方法三 修改JS代码 使用fiddler&#xff0c;抓…

C# 两种方案实现调用 DeepSeek API

目录 序 开发运行环境 访问API的一个通用方法 原生官网实现 申请 API key 调用实现 调用示例 腾讯云知识引擎原子调用 申请 API key 调用示例 小结 序 DeepSeek&#xff08;深度求索&#xff09; 最近可谓火爆的一塌糊涂&#xff0c;具体的介绍这里不再赘述&#x…

Linux下的进程切换与调度

目录 1.进程的优先级 优先级是什么 Linux下优先级的具体做法 优先级的调整为什么要受限 2.Linux下的进程切换 3.Linux下进程的调度 1.进程的优先级 我们在使用计算机的时候&#xff0c;通常会启动多个程序&#xff0c;这些程序最后都会变成进程&#xff0c;但是我们的硬…

anolis os 8.9安装jenkins

一、系统版本 # cat /etc/anolis-release Anolis OS release 8.9 二、安装 # dnf install -y epel-release # wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo # rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.…

Java基础知识总结(四十八)--TCP传输、TCP客户端、TCP服务端

**TCP传输&#xff1a;**两个端点的建立连接后会有一个传输数据的通道&#xff0c;这通道称为流&#xff0c;而且是建立在网络基础上的流&#xff0c;称之为socket流。该流中既有读取&#xff0c;也有写入。 **tcp的两个端点&#xff1a;**一个是客户端&#xff0c;一个是服务…

【python】http.server内置库构建临时文件服务

需要从linux开发机上下载一个文件到本地&#xff0c;约700M比较大&#xff0c;通过sz命令下载较慢且传输过程不稳定连续失败&#xff0c;后采用下面方式解决。 cd到一个目录下执行python -m http.server port&#xff0c;port为服务的端口号&#xff1a; 启动后浏览器中访问…

网络安全ids是什么意思

1、 简述IPS和IDS的异同点&#xff1b; 入侵检测系统&#xff08;IDS&#xff09; IDS&#xff08;Intrusion Detection Systems&#xff0c;入侵检测系统&#xff09;&#xff0c;专业上讲就是依照一定的安全策略&#xff0c;对网络、系统、运行状况进行监视&#xff0c;尽可能…

优选驾考小程序

第2章 系统分析 2.1系统使用相关技术分析 2.1.1Java语言介绍 Java语言是一种分布式的简单的 开发语言&#xff0c;有很好的特征&#xff0c;在安全方面、性能方面等。非常适合在Internet环境中使用&#xff0c;也是目前企业级运用中最常用的一个编程语言&#xff0c;具有很大…

42.水果销售系统(springbootvue的Java项目[含微信小程序])

目录 1.系统的受众说明 2.开发环境与技术 2.1 MYSQL数据库 2.2 Java语言 2.3 微信小程序技术 2.4 SpringBoot框架 2.5 B/S架构 2.6 Tomcat 介绍 2.7 HTML简介 2.8 MyEclipse开发工具 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作…

ffmpeg所有版本下载地址

地址如下&#xff1a;Index of /releaseshttps://ffmpeg.org/releases/

记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-效果展示(4)

如果有人给你一串JSON数据,你需要编辑他,对于有开发基础的人来说,可能会好处理下,而对于没有开发基础的人来说,那就是灾难了! 那么有没有一个东西,可以让这个编辑更顺畅呢? 贴代码案例中的DynamicForm你值得拥有!本次展示作者在本机上操作IIS的示例,如下 IIS展示 先…

3D文档控件Aspose.3D实用教程: 在 Java 中创建 FBX 文件并无缝将圆柱体转换为网格

概述 创建FBX文件并将圆柱体转换为网格是 3D 建模和动画中的基本任务。这些过程在游戏、电影和建筑等行业中至关重要。通过使用Aspose.3D for Java &#xff0c;开发人员可以高效地管理 3D 场景和对象。这个强大的 Java 3D API 简化了 3D 模型的创建和操作。它的易用性和灵活性…

软考高级《系统架构设计师》知识点(一)

计算机硬件 校验码 码距&#xff1a;就单个编码A:00而言&#xff0c;其码距为1&#xff0c;因为其只需要改变一位就变成另一个编码。在两个编码中&#xff0c;从A码到B码转换所需要改变的位数称为码距&#xff0c;如A:00要转换为B:11&#xff0c;码距为2。一般来说&#xff0c;…