(二十四)进阶算法

news2025/2/23 6:50:24

文章目录

    • (一)埃氏筛法
      • 1. 原理
      • 2. 代码
      • 3. 特点
    • (二)欧拉筛法
      • 1. 原理
      • 2. 代码
      • 3. 特点
    • (三)分解质因数
      • 1. 原理
      • 2. 代码
    • (四)斐波那契数列
      • 1. 递推式
      • 2. 代码
        • (1) 方法1
        • (2) 方法2

经过12天的“魔鬼集训”,我又回来更新了。这篇文章是关于算法的
毕竟集训期间天天讲

(一)埃氏筛法

1. 原理

它是用来筛选质数的,从2开始看(因为1不是质数也不是合数),2是质数,筛选掉所有是2的倍数的数,它们是合数,不知道什么是质数合数点我。随后看下一个没有被筛掉的数:3,再来筛掉,然后看数字5,把数字五的倍数筛掉…

2. 代码

#include <bits/stdc++.h>
using namespace std; 
int a[1001]; //用于记录质数 
bool prime[1001]; //质数筛 
int cnt = 0; //质数的个数
void eldri() {
	fill(prime+2, prime+1001, true); //除1以外,其他的都可能是质数 
	for(int i=2; i<=1000; i++) {
		if(prime[i]) {//判断i有没有被筛掉 
			a[++cnt] = i; 
			for(int j=2*i; j<=1000; j+=i) //筛掉i的倍数 
				prime[j] = false; 
		}
	}
}
int main() {
	ios::sync_with_stdio(false); //加速代码
	cin.tie(0); 
	cout.tie(0); 
	eldri(); //运行函数
	cout << "1~1000中的质数有:"; 
	for(int i=1; i<=cnt; i++) 
		cout << a[i] << " "; 
	cout << endl << "1~1000中质数的个数:" << cnt; 
	return 0; 
}

3. 特点

优点: 比一个个筛质数更好
缺点: 会重复看某个合数
时间复杂度: O ( n l o g l o g n ) O(nloglogn) O(nloglogn)
注意事项: 质数表和质数筛都得放在main()函数外,一是无法访问,二才是段错误
段错误(segmentation fault)可以理解为函数内的变量占用字节太大了,也可能是访问了野指针(指向nullptr或者NULL)或者数组访问越界
毕竟main()也是函数请添加图片描述

(二)欧拉筛法

1. 原理

欧拉筛法的思想是每个合数只被它最小的质数筛掉,比如在看数字 2 2 2时,可以先不考虑筛掉 30 30 30,等到 15 15 15时再筛掉

2. 代码

#include <bits/stdc++.h>
using namespace std; 
bool isp[1001]; //质数表 
int prime[1001]; //质数 
int cnt=0; //质数个数 
void euler() {
	fill(isp+2, isp+1001, true); //除1以外,其他的都可能是质数
	for(int i=2; i<=1000; i++) {
		if(isp[i])
			prime[++cnt] = i; 
		for(int j=1; j<=cnt&&i*prime[j]<=1000; j++) { //质数合数都来筛
			isp[i*prime[j]] = false; //筛掉 
			if(i%prime[j]==0) break; //超出有效范围,退出循环,也是欧拉筛法的关键 
		}
	}
}
int main() {
	ios::sync_with_stdio(false); //加速代码
	cin.tie(0); 
	cout.tie(0); 
	euler(); //运行代码 
	cout << "1~1000间的质数:"; 
	for(int i=1; i<=cnt; i++)
		cout << prime[i] << ' '; 
	cout << endl << "1~1000间质数的个数:" << cnt; 
	return 0; 
}

3. 特点

优点: 不会重复筛数
时间复杂度: O ( n ) O(n) O(n)
注意事项: 分清楚里面的ij

(三)分解质因数

1. 原理

以一个数 84 84 84为例,假如被 2 2 2筛到不能筛时,就不可能被 4 , 6 , 8 4, 6, 8 4,6,8 整除了

2. 代码

#include <iostream>
using namespace std; 
void split(int n) {
	cout << n << '='; 
	int t = 2; //从2开始筛 
	bool flag = false; //是否输出'*' 
	while(n>1) { 
		if(n%t==0) { //n还能整除t
			n /= t; 
			if(flag++) cout << '*'; 
			cout << t; 
		} else { //不可以的话找下一个质数 
			t ++; 
		}
	}
}
int main() {
	int n; 
	cin >> n; 
	split(n); //调用函数 
	return 0; 
}

(四)斐波那契数列

1. 递推式

F i b n = F i b n − 1 + F i b n − 2 Fib_{n}=Fib_{n-1}+Fib_{n-2} Fibn=Fibn1+Fibn2
边界条件: F i b 1 = 1 , F i b 2 = 1 Fib_{1}=1, Fib_{2}=1 Fib1=1,Fib2=1

2. 代码

(1) 方法1
#include <iostream>
#define int unsigned long long //宏定义
using namespace std; 
int fib(int n) {
	if(n==1||n==2) return 1; //边界条件 
	else return fib(n-1)+fib(n-2); //递归式 
}
signed main() { //signed代替int
	int n; 
	cin >> n; 
	cout << fib(n); //调用函数 
	return 0; 
}

但是这样会重复算一些数字
f i b 4 = f i b 3 + f i b 2 = f i b 2 + f i b 1 + f i b 2 = 1 + 1 + 1 = 3 fib_4=fib_3+fib_2 = fib_2+fib_1+fib_2=1+1+1=3 fib4=fib3+fib2=fib2+fib1+fib2=1+1+1=3
这个式子重复计算了 f i b 2 fib_2 fib2
我们可以仿造埃氏筛,做一个用于存储数值的数组

(2) 方法2
#include <iostream>
#define int unsigned long long //宏定义
using namespace std; 
int a[51] = {}; 
int fib(int n) {
	if(n==1||n==2) return 1; //边界条件 
	else if(a[n]>0) return a[n]; //寄存了a[n] 
	else return a[n]=fib(n-1)+fib(n-2); //二合一,表示返回值并赋值 
}
signed main() { //signed代替int
	int n; 
	cin >> n; 
	cout << fib(n); //调用函数 
	return 0; 
}

这样就能解决这个问题了! 请添加图片描述


预览:

  • 十九:指针与迭代器
  • 二十:位运算与进制
  • 二十一:联合体(union)
  • 二十二:类(class)
  • 二十三:高精度运算
  • 二十四:算法进阶
  • 二十五:递归
  • 二十六:vector容器
  • 二十七:递推
  • 二十八:set容器
  • 二十九:map容器

请添加图片描述

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

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

相关文章

[240728] Wikidata 介绍 | 微软与 Lumen 合作提升人工智能算力

目录 Wikidata 介绍微软与 Lumen 合作提升人工智能算力 Wikidata 介绍 中文&#xff1a; 文言: 粤语&#xff1a; 来源&#xff1a; https://www.wikidata.org/wiki/Wikidata:Introduction/zh 微软与 Lumen 合作提升人工智能算力 为了满足人工智能工作负载不断增长的需求&am…

(2024,通用逼近定理(UAT),函数逼近,Kolmogorov–Arnold定理(KAT),任意深度/宽度的网络逼近)综述

A Survey on Universal Approximation Theorems 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. 神经网络&#xff08;NN&#xff09; 3. 通用逼近定理&#xff0…

openssh服务升级到最新版本OpenSSH-9.8p1完全手册---- (只适用于centos6)

[年] 在centos6下编译openssh-9.8p1的rpm包 1、创建用于rpm编译的目录 mkdir -p /root/rpmbuild/SPEC mkdir -p /root/rpmbuild/SOURCES 2、安装rpmbuild和一些其它的基本依赖 yum install gcc gcc-c rpm-build -y 3、上传openssh-9.8p1.tar.gz 这个源码包到centos6服务器上&am…

一篇文章教你如何读懂 JMeter聚合报告参数!

在进行性能测试时&#xff0c;JMeter是一款备受推崇的开源工具。而其中的聚合报告&#xff08;Aggregate Report&#xff09;是我们分析测试结果、了解系统性能的重要依据。今天&#xff0c;我们就来深入探讨如何读懂JMeter聚合报告中的各项参数。 面对复杂的聚合报告&#xf…

MySQL创建表完全指南-从零开始学习数据库设计

MySQL创建表快速指南 在大数据时代,掌握数据库技能至关重要。无论你是刚入门的开发者,还是经验丰富的数据分析师,了解如何创建MySQL表格都是必备技能。本文将为你详细讲解MySQL创建表格的全过程,帮助你快速上手数据库设计。 1. 连接到MySQL服务器 首先,确保你已经安装了MyS…

Linux 的超级记事本(代码编辑器) —— vim

Linux 的超级记事本&#xff08;代码编辑器&#xff09; —— vim 关于 vimvim 的使用入门级使用——多模式基础使用——多模式插入模式&#xff08;Insert mode&#xff09;理解 命令模式&#xff08;command mode&#xff09;理解命令集 底行模式&#xff08;last line mode&…

Logback 快速入门

一、简介 Java 开源日志框架&#xff0c;以继承改善 log4j 为目的而生&#xff0c;是 log4j 创始人 Ceki Glc 的开源产品。 它声称有极佳的性能&#xff0c;占用空间更小&#xff0c;且提供其他日志系统缺失但很有用的特性。 其一大特色是&#xff0c;在 logback-classic 中本…

5G 基站特有的 5 个关键同步挑战

随着 5G 的推出和 O-RAN 联盟等举措&#xff0c;移动设备领域正在遭遇相当大的颠覆&#xff0c;这当然适用于基站和移动回程。 从手机到物联网设备&#xff0c;设备数量呈爆炸式增长&#xff0c;再加上移动视频流、工业物联网和汽车应用等新应用&#xff0c;给移动网络带来了容…

自学JavaScript(放假在家自学第一天)

目录 JavaScript介绍分为以下几点 1.1 JavaScript 是什么 1.2JavaScript书写位置 1.3 Javascript注释 1.4 Javascript结束符 1.5 Javascript输入输出语法 JavaScript(是什么?) 是一种运行在客户端(浏览器)的编程语言&#xff0c;实现人机交互效果。 2.作用(做什么?)网…

算法-插入排序

插入排序步骤 前面文章分享了两种排序算法&#xff1a;冒泡排序和选择排序。虽然它们的效率都是O(N2)&#xff0c;但其实选择排序比冒泡排序快一倍。现在来学第三种排序算法——插入排序。你会发现&#xff0c;顾及最坏情况以外的场景将是多么有用。 插入排序包括以下步骤。 …

从0开始搭建vue + flask 旅游景点数据分析系统(一):创建前端项目

根据前面的爬虫课程&#xff0c;我们重新开一个坑&#xff0c;就是基于爬取到的数据&#xff0c;搭建一个vueflask的前后端分离的数据分析系统 1 通过这个系列教程可以学习到什么&#xff1f; 从0开始搭建一个 vue flask 的数据分析系统&#xff1b;了解系统的整体架构&…

BSPTool工具

BSPTool工具 链接&#xff1a;https://pan.baidu.com/s/1UxMPjJtCHHkadFwnOfLqww?pwd1234 提取码&#xff1a;1234 1.使用方式 下载下来后&#xff0c;双击exe即可 2.MTK常用工具 2.1 MTK导出日志功能 2.2 导fulldump日志 2.3 .合并日志: 2.4 ADB指令集合 2.5 Fastboot指…

传统自然语言处理(NLP)与大规模语言模型(LLM)详解

自然语言处理&#xff08;NLP&#xff09;和大规模语言模型&#xff08;LLM&#xff09;是理解和生成人类语言的两种主要方法。本文将介绍传统NLP和LLM的介绍、运行步骤以及它们之间的比较&#xff0c;帮助新手了解这两个领域的基础知识。 传统自然语言处理&#xff08;NLP&…

指针!!C语言(第三篇)

目录 一. 二维数组传参的本质 二. 函数指针变量和函数指针数组 三. typedef关键字 四. 转移表 五. 回调函数以及qsort使用举例 一. 二维数组传参的本质 &#x1f35f;首先我们先回顾一下二维数组是怎样传参的&#xff1f;我们需要传入数组名以及行数和列数&#xff0c;这…

VS C++ Project(项目)的工作目录设置

如果只是简单创建一个VS CProject或者MFC Project&#xff0c;可能很多时候&#xff0c;只关心将Project放在硬盘的那个位置&#xff0c;与Project目录相关的的其他问题&#xff0c;并不引人注意&#xff0c;我们也不是十分在意。有时我们不得不进行工作目录方面的设置&#xf…

Javascript前端面试(七)

JavaScript 部分 1. JavaScript 有哪些数据类型&#xff0c;它们的区别&#xff1f; JavaScript 共有八种数据类型&#xff0c;分别是 Undefined、Null、Boolean、 Number、String、Object、Symbol、BigInt。 其中 Symbol 和 BigInt 是 ES6 中新增的数据类型&#xff1a; ●Sym…

卷积神经网络(一)---原理和结构

在介绍卷积神经网络之前&#xff0c;先提出三个观点&#xff0c;正是这三个观点使得卷积神经网络能够真正起作用。 1. 局部性 对于一张图片而言&#xff0c;需要检测图片中的特征来决定图片的类别&#xff0c;通常情况下这些特征都不是由整张图片决定的&#xff0c;而是由一些…

暑期集训周报三

题解 SMU Summer 2024 Contest Round 8-CSDN博客 CSDN 积累题目 dp 1.花店橱窗 思路&#xff1a;用dp[i][j]表示第i个放在j位置上的最大价值&#xff0c;那么我们可以枚举i-1被放在了区间[i-1,j-1]的那个位置&#xff0c;找到最大价值部分&#xff0c;然后更新dp[i][j]&a…

gitee的远程连接与公钥SSH的连接

目录 1. 登录注册gitee1.1 登录注册1.2 创建仓库 2. 远程连接3. 公钥连接4. 参考链接 1. 登录注册gitee 1.1 登录注册 gitee官网 进入后进行登录注册 1.2 创建仓库 2. 远程连接 在你想要上传文件的文件夹中进行git初始化&#xff08;我在其他文章已经写过&#xff0c;链接…

FastAPI(七十六)实战开发《在线课程学习系统》接口开发-- 课程详情

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 这个接口用户可以不登录&#xff0c;因为我们的课程随意浏览 那么我们梳理下这里的逻辑 1.根据课程id判断课程是否存在 2.课程需要返回课程的详情 3…