算法-----高精度2(高精度乘法,高精度除法,高精度斐波那锲数列)

news2024/11/27 15:54:27

高精度乘法

对于高精度乘法来说似乎不像高精度加减法那样简单了,我们似乎得一个一个加了,因为我们都知道
a×b=a+a+a+a+a…+a(b个a)。如果真要这要的话那1e9*1e9不得超时啊,所以不能这样,我们还是得从乘法竖式入手
在这里插入图片描述
这样看似乎看不出来什么,那我们可以对其改变下模式可以进行撤位看看
在这里插入图片描述
这样就撤位成功了,但肯定不是 最后结果,每一位都要化成一位数。但是我们可以先等等,观察一下规律。不难发现当逆序存储后,我们做乘法竖式模拟时,c[i+j]+=a[i]*b[j](下标从零开始)。

在这里插入图片描述
最后我们只需进下位就行了。
所以我们的思路来了:
1.枚举a枚举b,相乘再加到c里
2.加完之后再进位
3,别忘去掉前导零

好的开始代码环节
初始化(不多说)

string s1,s2;
const int N=2050;
int a[N],b[N],c[N],len1,len2,len3;

读入

void Read(){
	cin>>s1>>s2;
    len1=s1.size(),len2=s2.size();
    len3=len1+len2;              //c数组的长度,因为公式是c[i+j]+=a[i]*b[j],所以i+j的最大值就是c的长度
    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(){
	for(int i=0;i<len1;i++){//枚举a
	   for(int j=0;j<len2;j++){//枚举b
	   	c[i+j]+=a[i]*b[j];//公式
	   }
	} 
	for(int i=0;i<len3;i++){//进位
		if(c[i]>=10){
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
	}
	while(len3>0&&c[len3-1]==0) len3--;  //去前导零
}

输出

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

总代码

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
const int N=2050;
int a[N],b[N],c[N],len1,len2,len3;
void Read(){
	cin>>s1>>s2;
    len1=s1.size(),len2=s2.size();
    len3=len1+len2;
    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(){
	for(int i=0;i<len1;i++){
	   for(int j=0;j<len2;j++){
	   	c[i+j]+=a[i]*b[j];
	   }
	} 
	for(int i=0;i<len3;i++){
		if(c[i]>=10){
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
	}
	while(len3>0&&c[len3-1]==0) len3--;
}
void print(){
	for(int i=len3-1;i>=0;i--) cout<<c[i];
}
int main()
{
Read();
count();
print();
	return 0;
}

高精度除法

高精度除以低精度

因为除数是低精度,所以我们不用竖式就能解,用逐位相除法。
在这里插入图片描述
初始化+读入(因为是除法所以不用逆序存储,正着就行)

string s;
const int N=1050;
int a[N],c[N],b,len,lenc=1,x;
void Read(){
	cin>>s>>b;
	len=s.size();
	for(int i=1;i<=len;i++) a[i]=s[i-1]-'0';//顺着存
}

运算
因为除法如果不够除的话是填零(或是有余),我们可以将不够除(或除完的余数)的放入后面让他和后面的数一起除,不过要注意*10因为他们的单位不同,当然有时候我们会求余数,所以我们可以带入余数让计算的更简单些。

void count(){
	for(int i=1;i<=len;i++){
		c[i]=(x*10+a[i])/b;//带着余数除当除到最后一位时%后就是余数
		x=(x*10+a[i])%b;
	}
	while(lenc<len&&c[lenc]==0) lenc++;
}

输出

void print(){
	while(lenc<=len) cout<<c[lenc++];
	cout<<"\n";
	cout<<x;
}

总代码

#include<bits/stdc++.h>
using namespace std;
string s;
const int N=1050;
int a[N],c[N],b,len,lenc=1,x;
void Read(){
	cin>>s>>b;
	len=s.size();
	for(int i=1;i<=len;i++) a[i]=s[i-1]-'0';
}
void count(){
	for(int i=1;i<=len;i++){
		c[i]=(x*10+a[i])/b;
		x=(x*10+a[i])%b;
	}
	while(lenc<len&&c[lenc]==0) lenc++;
}
void print(){
	while(lenc<=len) cout<<c[lenc++];
	cout<<"\n";
	cout<<x;
}
int main()
{
Read();
count();
print();
	return 0;
}

高精度除以高精度

高精度除以高精度,第一眼肯定是竖式,但你用竖式算过后会发现,似乎难找到怎么做。所以我们得从其他方面入手,先看看除法算式a/b,平平无奇,写下结果后呢?a/b=c…d,看到这个算式大家应该有点印象了,二三年级时我们学习的除法各个元素之间的关系:
1.a=b×c+d
2.b=(a-d)/c
3.c=(a-d)/b
4.d=a-b×c
随后我们再回顾下除法的定义:把一个数平均分成几份。根据这几条不难发现,a/b,不就是a-c个b吗
所以我们便能开始写代码了
初始化+读入(注意这里出现减法了得倒序)

#define N 1050
int a[N],b[N],c[N],d,i;
void init(int a[]){
	string s;
	cin>>s;
	a[0]=s.size();
	for(int i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0';
}

判断大小函数(因为是减法替除法,要判断下,如果a<b就要终止)

int compare(int a[],int b[]){  
	int i;
	if(a[0]>b[0]) return 1;
	if(a[0]<b[0]) return -1;
	for(i=a[0];i>0;i--){
		if(a[i]>b[i]) return 1;
		if(a[i]<b[i]) return -1;
	}
	return 0;
}

移动函数,因为单位不统一,要将单位统一才能做减法

void numcpy(int p[],int q[],int det){
	for(int i=1;i<=p[0];i++) q[i+det-1]=p[i];
	q[0]=p[0]+det-1;
}

减法函数与除法函数

void jian(int a[],int b[]){
	int flag,i;
	flag=compare(a,b);
	if(flag==0){
		a[0]=0;
		return;
	}
	if(flag==1){
		for(i=1;i<=a[0];i++){
			if(a[i]<b[i]){
				a[i+1]--;
				a[i]+=10;
			}
			a[i]-=b[i]; 
		}
		while(a[0]>0&&a[a[0]]==0) a[0]--;
		return; 
	}
}
void chugao(int a[],int b[],int c[]){
	int i,tmp[N];
	c[0]=a[0]-b[0]+1;
	for(i=c[0];i>0;i--){
		memset(tmp,0,sizeof tmp);
		numcpy(b,tmp,i);
		while(compare(a,tmp)>=0){
			c[i]++;
			jian(a,tmp);
		}
	}
	while(c[0]>0&&c[c[0]]==0) c[0]--;
	return;
}

最后输出

void print(int a[]){
	int i;
	if(a[0]==0){
		cout<<0<<endl;
		return;
	}
	for(i=a[0];i>0;i--) cout<<a[i];
	cout<<endl;
	return;
}

总代码

#include<bits/stdc++.h>
using namespace std;
#define N 1050
int a[N],b[N],c[N],d,i;
void init(int a[]){
	string s;
	cin>>s;
	a[0]=s.length();
	for(int i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0';
}
void print(int a[]){
	int i;
	if(a[0]==0){
		cout<<0<<endl;
		return;
	}
	for(i=a[0];i>0;i--) cout<<a[i];
	cout<<endl;
	return;
}
int compare(int a[],int b[]){  
	int i;
	if(a[0]>b[0]) return 1;
	if(a[0]<b[0]) return -1;
	for(i=a[0];i>0;i--){
		if(a[i]>b[i]) return 1;
		if(a[i]<b[i]) return -1;
	}
	return 0;
}
void jian(int a[],int b[]){
	int flag,i;
	flag=compare(a,b);
	if(flag==0){
		a[0]=0;
		return;
	}
	if(flag==1){
		for(i=1;i<=a[0];i++){
			if(a[i]<b[i]){
				a[i+1]--;
				a[i]+=10;
			}
			a[i]-=b[i]; 
		}
		while(a[0]>0&&a[a[0]]==0) a[0]--;
		return; 
	}
}
void numcpy(int p[],int q[],int det){
	for(int i=1;i<=p[0];i++) q[i+det-1]=p[i];
	q[0]=p[0]+det-1;
}
void chugao(int a[],int b[],int c[]){
	int i,tmp[N];
	c[0]=a[0]-b[0]+1;
	for(i=c[0];i>0;i--){
		memset(tmp,0,sizeof tmp);
		numcpy(b,tmp,i);
		while(compare(a,tmp)>=0){
			c[i]++;
			jian(a,tmp);
		}
	}
	while(c[0]>0&&c[c[0]]==0) c[0]--;
	return;
}
int main()
{
init(a);
init(b);
chugao(a,b,c);
print(c);
print(a);//通过减法最后的a就是余数
	return 0;
}

高精度斐波那契数列

f[1]=1

f[2]=1

f[i]=f[i−1]+f[i−2]

求f[n]

输入
输入一个整数n

输出
输出一个整数

样例
输入 1
3
输出 1
2
提示
n<=200
【分析】这题目肯定要高精度的因为当n到100时都已经是354224848179261915075(别问我答案哪来的)了,long long 都存不下,所以的用高精度加法一步步加
好的高精度加法模板来了(没有读入)

const int N=1050;
int a[N],b[N],c[N],len=1,len1=1,len2=1;
void count(){
	int jw=0;
	for(int i=0;i<len;i++){
		c[i]=jw+a[i]+b[i];
		jw=c[i]/10;
		c[i]%=10;
	}
	if(jw==1){
		c[len]=1;
		len++;
	}
	while(len>1&&c[len-1]==0) len--;
}
void print(){
for(int i=len-1;i>=0;i--) cout<<c[i];
}

然后主函数部分是输出n,
对于这个n我们得先特判掉一些

if(n==1||n==2){
	cout<<1;
	return 0;
}

随后因为斐波那锲数列数f(n)=f(n-1)+f(n-2),我们的先存入前两项

a[0]=1;
b[0]=1;

然后就是动规的模板了

for(int i=3;i<=n;i++){
c=a+b;
a=b;
b=c;
}

简单带入下便是

for(int i=3;i<=n;i++)
{
	count();
	len1=len2;
	for(int i=0;i<len2;i++){//数组赋值
		a[i]=b[i];
	}
	len2=len;
	for(int i=0;i<len;i++) b[i]=c[i];
}

最后别忘记输出
总代码

#include<bits/stdc++.h>
using namespace std;
const int N=1050;
int a[N],b[N],c[N],len=1,len1=1,len2=1;
void count(){
	int jw=0;
	for(int i=0;i<len;i++){
		c[i]=jw+a[i]+b[i];
		jw=c[i]/10;
		c[i]%=10;
	}
	if(jw==1){
		c[len]=1;
		len++;
	}
	while(len>1&&c[len-1]==0) len--;
}
void print(){
for(int i=len-1;i>=0;i--) cout<<c[i];
}
int main(){
int n;
cin>>n;
if(n==1||n==2){
	cout<<1;
	return 0;
}
a[0]=1;
b[0]=1;
for(int i=3;i<=n;i++)
{
	count();
	len1=len2;
	for(int i=0;i<len2;i++){
		a[i]=b[i];
	}
	len2=len;
	for(int i=0;i<len;i++) b[i]=c[i];
}
print();
return 0;
}

完结!

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

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

相关文章

代码随想录算法训练营DAY18 | 二叉树 (5)

一、LeetCode 513 找树左下角的值 题目链接&#xff1a;513.找树左下角的值https://leetcode.cn/problems/find-bottom-left-tree-value/ 思路一&#xff1a;递归回溯全局变量比深度。 class Solution {int Max_depth 0;int result 0;public int findBottomLeftValue(TreeNo…

CAN通讯协议学习

介绍 它是一种异步通讯&#xff0c;can_high和can_low两条线利用的是电位差传输信号&#xff0c;抗干扰能力强&#xff0c;但是必须要有can控制器如TJA1050&#xff08;我的开发板&#xff09; 当 CAN 节点需要发送数据时&#xff0c;控制器把要发送的二进制编码通过 CAN_Tx 线…

数学建模:BP神经网络(含python实现)

原理 BP 神经网络&#xff0c;也称为多层感知机&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;&#xff0c;是一种常见的神经网络模型&#xff0c;用于解决各种机器学习问题&#xff0c;包括分类和回归。BP 代表“反向传播”&#xff08;Backpropagation&#…

磁盘database数据恢复: ddrescue,dd和Android 设备的数据拷贝

ddrescue和dd 区别&#xff1a; GNU ddrescue 不是 dd 的衍生物&#xff0c;也与 dd 没有任何关系 除了两者都可用于将数据从一台设备复制到另一台设备。 关键的区别在于 ddrescue 使用复杂的算法来复制 来自故障驱动器的数据&#xff0c;尽可能少地造成额外的损坏。ddrescue…

可视化锻炼日记ExerciseDiary

什么是 ExerciseDiary &#xff1f; ExerciseDiary 是带有 GitHub 风格的年度可视化的锻炼日记。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 exercisediary &#xff0c;选择第一个 aceberg/exercisediary&#xff0c;版本选择 latest。 本文写作时&#xff0c; lat…

【面试】盘点10个高频的前端算法题,你全都会了吗?

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 现在前端的面试中&#xff0c;算法出现的频率越来越高了&#xff0c;大厂更是必考算…

北邮复试刷题103. 二叉树的锯齿形层序遍历

103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a;输入&#xff1a…

Acwing---846. 树的重心

树的重心 1.题目2.基本思想3.代码实现 1.题目 给定一颗树&#xff0c;树中包含 n n n 个结点&#xff08;编号 1 ∼ n 1∼n 1∼n&#xff09;和 n − 1 n−1 n−1 条无向边。 请你找到树的重心&#xff0c;并输出将重心删除后&#xff0c;剩余各个连通块中点数的最大值。 …

Kafka King 推荐一款漂亮、现代、实用的kafka客户端

Kafka King 一个漂亮、现代、实用的kafka客户端&#xff0c;使用python flet、flutter构建。 Github主页&#xff1a;https://github.com/Bronya0/Kafka-King 下载&#xff1a;https://github.com/Bronya0/Kafka-King/releases 功能清单 查看集群节点列表创建主题&#xf…

【动态规划】【C++算法】1563 石子游戏 V

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 本文涉及知识点 动态规划汇总 LeetCoce:1563 石子游戏 V 几块石子 排成一行 &#xff0c;每块石子都有一个关联值&#xff0c;关联值为整数&#xff0c;由数组 stoneValue 给出。 游戏中…

前端常见的设计模式

说到设计模式&#xff0c;大家想到的就是六大原则&#xff0c;23种模式。这么多模式&#xff0c;并非都要记住&#xff0c;但作为前端开发&#xff0c;对于前端出现率高的设计模式还是有必要了解并掌握的&#xff0c;浅浅掌握9种模式后&#xff0c;整理了这份文章。 六大原则&…

Leetcode-103. 二叉树的锯齿形层序遍历

这个年和树过不去啦啦啦&#xff01; 题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&…

【C++】:位图、布隆过滤器、哈希分割

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下位图、布隆过滤器、哈希分割&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精…

Kingfisher — 快速灵活的公共数据库下载工具

Kingfisher — 快速灵活的公共数据库下载工具 Kingfisher 是一个快速灵活的程序&#xff0c;用于从公共数据库下载序列文件 (及其元数据注释)&#xff0c;包括 European Nucleotide Archive (ENA)&#xff0c; NCBI SRA&#xff0c;亚马逊 AWS 和谷歌云。它的输入是一个或多个 …

Fluke ADPT 连接器新增对福禄克万用 Fluke 17B Max 的支持

所需设备&#xff1a; 1、Fluke ADPT连接器&#xff1b; 2、Fluke 17B Max&#xff1b; Fluke 17B Max拆机图&#xff1a; 显示界面如下图&#xff1a; 并且可以将波形导出到EXCEL: 福禄克万用表需要自己动手改造&#xff01;&#xff01;&#xff01;

2024年【危险化学品经营单位安全管理人员】考试报名及危险化学品经营单位安全管理人员考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试报名是安全生产模拟考试一点通总题库中生成的一套危险化学品经营单位安全管理人员考试资料&#xff0c;安全生产模拟考试一点通上危险化学品经营单位安全管理人员作业手机同步练习…

C#(C Sharp)学习笔记_循环语句【七】

什么是循环语&#xff1f; 循环语句是由循环体及循环的终止条件两部分组成的。 在不少实际问题中有许多具有规律性的重复操作&#xff0c;因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体&#xff0c;能否继续重复&#xff0c;决定循环的终止条件。循环…

摸索设计模式的魅力:从策略模式看软件设计的智慧-灵活应对变化的艺术

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 一、案例场景1.1 一坨坨代码实现1.2 存在的问题 二、使用策略模式解决问题2.1 使用策略模式重构代码2.2 克服了问题 三、模式讲解3.1 结构图及说明3.2 实现步骤和注意事项3.3 适用场景 四、优势和局限性4.1 优势4.2 局…

IP地址+子网掩码+CIDR学习笔记

目录 一、IP地址 1、表示方法&#xff1a; 2、特殊IP地址 二、子网掩码 1、判断网络位和主机位 2、子网划分 三、无分类编址CIDR 1、CIDR路由汇聚 汇聚规则&#xff1a; 汇聚ID&#xff1a; 2、最佳路由匹配原则 一、IP地址 1、表示方法&#xff1a; 机器中存放的…

【报告解析】OpenAI Sora视频模型官方报告全解析 | 效果,能力以及基本原理

省流版 1 核心数据处理将视频数据整合成一个一个的Patch&#xff0c;方便统一训练数据&#xff0c;利用扩散Transformer架构 2 功能效果除了可以实现基础的文生视频外&#xff0c;实际上还有非常惊艳的视频延展&#xff0c;视频编辑&#xff0c;视频连接等多种功能&#xff0…