质数(判定质数 分解质因数 筛质数)

news2024/12/23 16:18:32

这里写目录标题

  • 一、判定质数
    • 思路分析
    • 代码实现
  • 二、分解质因数
    • 思路分析
    • 典型题目
    • 代码实现
  • 三、质数筛
    • 经典题目
    • 思路分析
      • 1. 朴素筛法
      • 2. 埃氏筛法
      • 3. 欧拉筛法


一、判定质数

思路分析

由于每个合数的因子是成对出现的,即如果 d d d n n n 的因子,那么 n d \frac{n}{d} dn 也是 n n n 的因子,故从 1 1 1 n n n 的枚举可以缩减到 1 1 1 n \sqrt{n} n ,即让 d ≤ n d d \leq \frac{n}{d} ddn,从而得到 d ≤ n d \leq \sqrt{n} dn


代码实现

bool is_prime(int n)
{
	if (n < 2) return false;
	for (int i = 2; i <= n / i; ++i)
	{
		if (n % i == 0) return false;
	}
	return true;
}

时间复杂度: O ( n ) O(\sqrt{n}) O(n )


二、分解质因数

思路分析

每个合数都是由质数相乘得到的。合数可以写成质因数的乘积,这是数论中的一个基本命题。

例如:
12 = 2 * 2 * 3
18 = 2 * 3 * 3
24 = 2 * 2 * 2 * 3

① 对于任何一个合数 n n n,在它的质因数分解中,最多只会有一个质因子大于或等于 n \sqrt{n} n

② 同时也可以推出,对任何一个合数 n n n,在它的质因数分解中,至少会有一个质因子小于或等于 n \sqrt{n} n


典型题目

题目描述:
给定 n n n 个正整数 a i a_i ai,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。

输入格式:
第一行包含整数 n n n

接下来 n n n 行,每行包含一个正整数 a i a_i ai

输出格式:
对于每个正整数 a i a_i ai,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。

每个正整数的质因数全部输出完毕后,输出一个空行。

数据范围:
1 ≤ n ≤ 100 , 2 ≤ a i ≤ 2 ∗ 1 0 9 1≤n≤100,2≤a_i≤2*10^9 1n100,2ai2109

输入样例:

2
6
8

输出样例:

2 1
3 1

2 3

代码实现

#define _CRT_NO_SECURE_WARNINGS
#include<iostream>

using namespace std;

void divide(int x)
{
	for (int i = 2; i <= x / i; ++i) // 遍历出所有小于或等于sqrt(n)的质因子
	{
		if (x % i == 0)
		{
			int cnt = 0;
			while (x % i == 0)
			{
				cnt++;
				x /= i;
			}
			cout << i << ' ' << cnt << endl;
		}
	}
	// 输出大于sqrt(n)的质因子或是质数本身
	if (x > 1) cout << x << ' ' << 1 << endl;
	cout << endl;
}
int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		int x;
		cin >> x;
		divide(x);
	}
	return 0;
}

时间复杂度:在 O ( log ⁡ n ) O(\log n) O(logn) O ( n ) O(\sqrt n) O(n )之间
解释:若 n n n 2 2 2 的倍数,时间复杂度将会变为 O ( log ⁡ n ) O(\log n) O(logn)


三、质数筛

经典题目

题目描述:
给定一个正整数 n n n,请你求出 1 ∼ n 1∼n 1n 中质数的个数。

输入格式:
共一行,包含整数 n n n

输出格式:
共一行,包含一个整数,表示 1 ∼ n 1∼n 1n 中质数的个数。

数据范围:
1 ≤ n ≤ 1 0 6 1≤n≤10^6 1n106

输入样例:

8

输出样例:

4

思路分析

在这里插入图片描述
通过将素数的倍数筛掉的方法,剩余存留的则全为质数。

筛完后 P P P 2 2 2 ~ ( P − 1 P-1 P1) 之间不存在倍数关系,即 P P P 无质因子在 2 2 2 ~ ( P − 1 P-1 P1) 之间。


1. 朴素筛法

通过将2~n的所有数的倍数筛掉的方法来得到范围内所有的质数

#define _CRT_NO_SECURE_WARNINGS
#include<iostream>

using namespace std;

const int N = 1e6 + 10;
int prime[N], cnt;
bool st[N];

void get_prime(int n)
{
	for (int i = 2; i <= n; ++i)
	{
		if (!st[i])
		{
			prime[cnt++] = i;
		}
		for (int j = 2 * i; j <= n; j += i) st[j] = true; // 将所有质数的倍数都打上标记
	}
}
int main()
{
	int n;
	cin >> n;
	get_prime(n);
	cout << cnt << endl;
	return 0;
}

时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)

n 2 + n 3 + n 4 + . . . + + n n = n ( 1 2 + 1 3 + 1 4 + . . . + 1 n ) \frac{n}{2} + \frac{n}{3} + \frac{n}{4} + ... + + \frac{n}{n} = n(\frac{1}{2} + \frac{1}{3} + \frac{1}{4} + ... + \frac{1}{n}) 2n+3n+4n+...++nn=n(21+31+41+...+n1)

调和级数: lim ⁡ n → ∞ ( 1 2 + 1 3 + 1 4 + . . . + 1 n ) = ln ⁡ n + c \lim_{n \to \infty} (\frac{1}{2} + \frac{1}{3} + \frac{1}{4} + ... + \frac{1}{n}) = \ln n + c limn(21+31+41+...+n1)=lnn+c (欧拉常数 c = 0.577 c = 0.577 c=0.577)

因此可得时间复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn)


2. 埃氏筛法

优化了朴素筛法,只将2~n的质数的倍数筛掉的方法来得到范围内所有的质数

#define _CRT_NO_SECURE_WARNINGS
#include<iostream>

using namespace std;

const int N = 1e6 + 10;
int prime[N], cnt;
bool st[N];

void get_prime(int n)
{
	for (int i = 2; i <= n; ++i)
	{
		if (st[i]) continue;
		prime[cnt++] = i;
		for (int j = 2 * i; j <= n; j += i) st[j] = true;
	}
}
int main()
{
	int n;
	cin >> n;
	get_prime(n);
	cout << cnt << endl;
	return 0;
}

时间复杂度为 O ( n log ⁡ log ⁡ n ) O(n \log \log n) O(nloglogn)

质数定理:在 1 1 1 n n n 之间的质数个数约等于 n ln ⁡ n \frac{n}{\ln n} lnnn


3. 欧拉筛法

核心思想:在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。

步骤:

  • i = 2 i = 2 i=2 开始,如果 i i i 还没有被筛掉,则将 i i i 加入至素数列表中。
  • 遍历当前素数列表 p r i m e [ ] prime[] prime[],筛去 i ∗ p r i m e [ j ] i ∗ prime[j] iprime[j]
    (保证 p r i m e [ j ] ∗ i prime[j] ∗ i prime[j]i 不能越界,因为越界了对结果没意义。即 i ∗ p r i m e [ j ] ≤ n i ∗ prime[j] \leq n iprime[j]n
  • 当遍历到能整除 i 的素数 p r i m e [ j ] prime[j] prime[j] 时,筛去 i ∗ p r i m e [ j ] i ∗ prime[j] iprime[j],停止对素数列表的遍历。
  • 重复 2 , 3 , 4 2,3,4 2,3,4,直到所有不超过 n n n 的整数都被遍历过素数列表中的元素即为所求的不超过 n n n 的所有素数。
#define _CRT_NO_SECURE_WARNINGS
#include<iostream>

using namespace std;

const int N = 1e6 + 10;
int cnt, prime[N];
bool st[N];

void get_prime(int n)
{
	for (int i = 2; i <= n; ++i)
	{
		if (!st[i]) prime[cnt++] = i;
		for (int j = 0; prime[j] <= n / i; j++)
		{
			st[prime[j] * i] = true;
			if (i % prime[j] == 0) break; // 只被它的最小质因子筛选一次
		}
	}
}
int main()
{
	int n;
	cin >> n;
	get_prime(n);
	cout << cnt << endl;
	return 0;
}

n < 1 0 6 n<10^6 n<106,筛和埃氏筛的时间效率差不多;若 n > 1 0 7 n>10^7 n>107,线性筛会比埃氏筛快了大概一倍。

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

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

相关文章

【python】两数之和 python实现(详细讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

使用gdb打印寄存器和地址的值

目录 一、文件介绍&#xff1a;1、源码2、目标文件test13、使用dynamorio工具生成的注释文件&#xff08;后面简称它注释文件吧&#xff09; 二、使用gdb调试目标文件1、设置断点2、设置汇编格式为intel3、打开tui界面&#xff08;汇编c语言&#xff09;4、run5、查看当前指令5…

tomcat8的安装与服务启动脚本的配置并部署jpress应用

目录 一.了解tomcat8 二.下载安装包 三.安装jdk与tomcat 1.安装jdk 2.安装tomcat &#xff08;1&#xff09;解压安装包并创建软链接 &#xff08;2&#xff09;设置启动用户并更改权限 &#xff08;3&#xff09;编写系统服务文件 &#xff08;4&#xff09;重新加载文件…

【计算机视觉|语音分离】期望在嘈杂环境中聆听:一个用于语音分离的不依赖于讲话者的“音频-视觉模型”

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Looking to Listen at the Cocktail Party: A Speaker-Independent Audio-Visual Model for Speech Separation 链接&#xff1a;Looking to listen at the cocktail party: a speaker-in…

数据采集的方法有哪些?

近年来&#xff0c;国家和各大企业都在部署大数据战略。“大数据”这个词也越来越频繁地出现在我们的生活中。当我们在进行网上冲浪时&#xff0c;页面总会跳出我们想要搜索的相关产品或关联事物。大数据&#xff0c;似乎总是能够“算”出我们“心中所想”。那么&#xff0c;大…

键入网址到网页显示,期间发生了什么

HTTP 浏览器做的第一步工作是解析URL 首先浏览器做的第一步工作就是要对URL进行解析&#xff0c;从而生成发送给 web 服务器的请求信息。 所以图中长长的URL实际上是请求服务器里的文件资源。 如果图中的蓝色部分URL元素省略了&#xff0c;那应该请求哪个文件呢&#xff1f; 当…

arcgis--连接到数据库失败--外部数据库驱动程序(1)

问题描述&#xff1a; 在加载Excel表格时出现以下问题&#xff0c;无法加载进来。 经过百般尝试&#xff0c;终于找到解决方法。 解决方案&#xff1a; 在微软官网下载accessDataEngine程序&#xff0c;并按照相关位数&#xff08;32位或64位&#xff09;安装&#xff0c;具…

FastAPI(七)应用配置

目录 一、在apps下新建文件夹config 二、新建配置文件app_conf.py 一、在apps下新建文件夹config 二、新建配置文件app_conf.py from functools import lru_cachefrom pydantic.v1 import BaseSettingsclass AppConfig(BaseSettings):app_name: str "Windows10 插件&qu…

git上传代码

gitee 1.生成密钥 输入ssh-keygen -t rsa 不断回车 2.查看密钥 3.设置里上传密钥 4.在git bash里输入ssh -T gitgitee.com

Boost开发指南-3.11pool_alloc

pool_alloc pool_alloc提供了两个可以用于标准容器模板参数的内存分配器&#xff0c;分别是pool_alloc和fast_pool_allocator&#xff0c;它们的行为与之前的内存池类有一点不同——当内存分配失败时会抛出异常std::bad_alloc。它们位于名字空间boost&#xff0c;需要包含头文…

uniapp h5支付宝支付后端返回Form表单,前端如何处理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.调取接口拿到后端返回的form表单 前言 uniapp h5 支付宝支付&#xff0c;后端返回一串form表单&#xff0c;前端如何拿到支付串并且调用支付 1.调取接口拿到…

[Docker实现测试部署CI/CD----Jenkins集成相关服务器(3)]

目录 7、 Jenkins 集成 SonarQubeJenkins 中安装 SonarScanner下载移动修改配置文件 8、Jenkins配置SonarQube安装插件添加SonarQube添加 SonarScanner 9、Jenkins集成目标服务器 7、 Jenkins 集成 SonarQube Jenkins 中安装 SonarScanner SonarScanner 是一种代码扫描工具&am…

维视智造人工智能产学研用交流会现场精彩回顾

2023年7月28日&#xff0c;维视智造人工智能产学研用交流会在维视智造西安公司成功举办&#xff0c;众多院校专家教授、企业代表齐聚一堂&#xff0c;共同交流探讨行业趋势&#xff0c;共享人才培养经验。 从2015年的《中国制造2025》&#xff0c;到今年的《新一代人工智能发展…

基于方向编码的模板匹配算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ........................................................................... %选择移动个…

C++库函数——String类的模拟实现

目录 ①String类的主体 ②String类的具体实现 1.构造函数、拷贝构造函数、赋值运算符、析构函数 ⑴构造函数 ⑵拷贝构造函数 ⑶赋值运算符 ⑷析构函数 2.迭代器&#xff08;范围for的实现原理&#xff09; 3.修改:push_back, apppend, , clear, swap, c_str ⑴push_b…

【BASH】回顾与知识点梳理(七)

【BASH】回顾与知识点梳理 七 七.前六章知识点总结及练习7.1 总结7.2 练习 七.前六章知识点总结及练习 7.1 总结 由于核心在内存中是受保护的区块&#xff0c;因此我们必须要透过『 Shell 』将我们输入的指令与 Kernel 沟通&#xff0c;好让 Kernel 可以控制硬件来正确无误的…

【Spring】深究SpringBoot自动装配原理

文章目录 前言1、main入口2、SpringBootApplication3、EnableAutoConfiguration4、AutoConfigurationImportSelector4.1、selectImports()4.2、getAutoConfigurationEntry()4.3、getCandidateConfigurations()4.4、loadFactoryNames() 5、META-INF/spring.factories6、总结 前言…

以beam search为例,详解transformers中generate方法(下)

以beam search为例&#xff0c;详解transformers中generate方法&#xff08;下&#xff09; 1. beam search原理回顾2. 代码流程概览3. BeamSearchScorer4. BeamHypotheses5. beam_search过程5.1 beam score初始化5.2 准备输入5.3 前向forward5.4 计算下一个step每个token的得分…

网络安全知识点整理(作业2)

目录 一、js函数声明->function 第一种 第二种 第三种 二、this关键字 this使用场合 1.全局环境 2.构造函数 3.对象的方法 避免多层this 三、js的同步与异步 定时器 setTimeout和setInterval 同步与异步的例子 四、宏任务与微任务 分辨宏任务与微任务 一、js…

深度学习——划分自定义数据集

深度学习——划分自定义数据集 以人脸表情数据集raf_db为例&#xff0c;初始目录如下&#xff1a; 需要经过处理后返回 train_images, train_label, val_images, val_label 定义 read_split_data(root: str, val_rate: float 0.2) 方法来解决&#xff0c;代码如下&#xff1a…