信息学奥赛初赛天天练-13-数论-素数的判定

news2024/9/20 20:48:15

更多资源请关注纽扣编程微信公众号
在这里插入图片描述
1 素数

质数又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,就是该数除了1和它本身以外不再有其他的因数;否则称为合数
1 既非素数也非合数
2 是唯一的偶素数。

2 素数的判定

1)朴素算法

根据质数的定义,可以遍历从 2 到自身看是否有被整除的数

时间复杂度

O(n)

示例代码

#include <bits/stdc++.h>
using namespace std;
/*
 根据素数的定义朴素算法求解 
*/
bool checkPrime(int n){
	if(n==1) return false;
	bool isPrime=true;
	for(int i=2;i<n;i++){//n对2~n-1 逐一求余,可以整除,余数为0则不是素数 
		if(n%i==0)
		{
			isPrime=false;
			break;
		}
	}
	//n对2~n-1 逐一求余,都不能整除 则为素数 
	return isPrime;
}

int main(){
	int x;
	cin>>x;
	if(checkPrime(x)) 
		cout<<x<<" 是素数!";
	else
		cout<<x<<" 不是素数!";	

	return 0;
}
/*
  输入 8 
  输出 8 不是素数
  输入 17
  输出 17是素数 
*/ 

2)优化算法1 - 试除法

一个数n的因数是成对出现的,如果n的一个因数是是d,那么必然会出现对应的一个因数n/d

因此2个因数d和n/d存在其中一个的时候另一个也必定存在,如果其中一个不存在,那么另一个也不存在。所以只要判断其中一个就可以了

例如 18

有3对因数,分别 [ 1,18 ] , [ 2, 9 ] , [ 3, 6 ],只需要除以1,2,3即可,循环到n/i 或者sqrt(n)即可

时间复杂度

O(sqrt(n))

示例代码

#include <bits/stdc++.h>
using namespace std;
/*
  优化算法 试除范围2~sqrt(n) 或者2~n/i 
*/
 
bool checkPrime(int n){
	if(n==1) return false;
	bool isPrime=true;
	for(int i=2;i<=n/i;i++){//n对2~n/i或者2~n/i 逐一求余,可以整除,余数为0则不是素数 
		if(n%i==0)
		{
			isPrime=false;
			break;
		}
	}
	//n对2~n/i或者2~n/i 逐一求余,都不能整除 则为素数 
	return isPrime;
}

int main(){
	int x;
	cin>>x;
	if(checkPrime(x)) 
		cout<<x<<" 是素数!";
	else
		cout<<x<<" 不是素数!";	

	return 0;
}
/*
  输入 8 
  输出 8 不是素数
  输入 17
  输出 17是素数 
*/ 

3)优化算法2 -只整除素数

如果 𝑛 是合数,那么它必然有一个小于等于sqrt(n) 的素因子,只需要对sqrt(n)内的素数进行测试即可,需要预处理求出sqrt(n)中的素数,假设该范围内素数的个数为s,那么复杂度降为 𝑂(𝑠)

在优化算法1试除法的基础上,2~sqrt(n) 范围素数进行试除

时间复杂度

O(s) -s是2~sqrt(n)范围内的素数的个数,由于素数个数比较稀疏,因此时间复杂度大大降低

示例代码

#include <bits/stdc++.h>
using namespace std;
/*
  优化算法 试除范围2~sqrt(n) 或者2~n/i 内的素数 
*/
const int N=1100; 
//存放1100内的素数,素数时间少很多 
int primes[N];//sqrt(10^6)是1000,因此可以计算10^6范围内的素数
/*
 试除法求素数,用于初始化素数数组
*/ 
bool checkPrime(int n){
	if(n==1) return false;
	bool isPrime=true;
	for(int i=2;i<=n/i;i++){//n对2~n/i或者2~n/i 逐一求余,可以整除,余数为0则不是素数 
		if(n%i==0)
		{ 
			isPrime=false;
			break;
		}
	}
	//n对2~n/i或者2~n/i 逐一求余,都不能整除 则为素数 
	return isPrime;
}
/*
  在优化算法1试除法的基础上,2~sqrt(n) 范围素数进行试除
*/
bool checkPrime2(int n){
	if(n==1) return false;
	bool isPrime =true;
	for(int i=0;i<=sqrt(n);i++){
		if(primes[i]>sqrt(n)){//2~sqrt(n) 范围素数都试除后,没用找到,结束 
			break;
		}
		if(n%primes[i]==0){//如果n可以整除2~sqrt(n)任意素数,在n不是素数 
			isPrime = false;
			break;
		}
	}
	return isPrime;
}

int main(){
	//初始化1100以内的素数 
	int pi=0;
	for(int i=2;i<=N;i++){
		if(checkPrime(i)) primes[pi++]=i;
	}
	int x;
	cin>>x;
	if(checkPrime2(x)) 
		cout<<x<<" 是素数!";
	else
		cout<<x<<" 不是素数!";	

	return 0;
}
/*
  输入 8 
  输出 8 不是素数
  输入 17
  输出 17是素数 
*/ 

3 算法性能对比

通过1道洛谷OJ题,对3个算法执行时间进行对比,主要关注如下红框内,标红的测试点的执行时间

https://www.luogu.com.cn/problem/B2137

1) 朴素算法

执行超时,执行时间1200ms

优化算法1 - 试除法

执行时间172ms,大大提升了执行效率,是朴素算法的1/6

优化算法2 -只整除素数

执行时间44ms,大大提升了执行效率,是优化算法1的1/4,是朴素算法的1/24

4 练习题

1)在100以内的数种最大的素数是()
A. 89 B. 97 C. 91 D. 93

2)完善程序

质因数分解给出正整数 n,请输出将 n 质因数分解的结果,结果从小到大输出

例如:输入 n=120,程序应该输出 2 2 2 3 5,表示:120 = 2 ×2 ×2 ×3 ×5

输入保证 2<=n<=10^9

提示:先从小到大枚举变量 i,然后用 i 不停试除 n来寻找所有的质因子

34.①处应填[3分]

A.1

B.n-1

C.2

D.0

35.②处应填[3分]

A.n/i

B.n/(i*i)

C.i*i

D.iii

36.③处应填[3分]

A.if(n%i==0)

B.if(i*i<=n)

C.while(n%i==0)

D.while(i*i<=n)

37.④处应填[3分]

A.n>1

B.n<=1

C.i<n/i

D.i+i<=n

5 获取源码和练习答案

https://www.luogu.com.cn/problem/B2137

获取洛谷B2137三种算法源码和练习题答案,扫描公众号二维码,回复20240527

在这里插入图片描述

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

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

相关文章

全局查询筛选器适用场景 以及各场景示例

EF Core中的全局查询筛选器&#xff08;Global Query Filters&#xff09;是一种强大的功能&#xff0c;可以在实体框架的DbContext级别为特定的EntityType设置默认的过滤条件。这些筛选器自动应用于所有涉及到相关实体的LINQ查询中&#xff0c;无论是直接查询还是通过Include或…

深入解读 ChatGPT 的基本原理(个人总结版)

引言 背景 人工智能&#xff08;AI&#xff09;技术自20世纪中期诞生以来&#xff0c;经历了多次革新和进步。从最早的图灵测试&#xff0c;到20世纪末的深蓝计算机击败国际象棋冠军&#xff0c;再到21世纪初谷歌AlphaGo击败围棋冠军&#xff0c;AI技术的飞速发展改变了人们的…

4,八种GPIO模式

资料来源:【STM32基础学习】八种GPIO模式总结-云社区-华为云 (huaweicloud.com) 【STM32基础学习】八种GPIO模式总结-云社区-华为云 (huaweicloud.com) 【STM32基础学习】八种GPIO模式总结-云社区-华为云 (huaweicloud.com) 仅作个人自学笔记&#xff0c;如有冒犯&#xf…

STM32Cube系列教程10:STM32CubeIDE工程创建+串口DMA+IDLE+printf重定向+软中断处理串口数据+非阻塞延时任务

文章目录 工程配置配置时钟配置Debug接口配置串口外设配置时钟树生成代码 配置串口重定向printf配置串口&#xff0c;开启IDLE&#xff0c;开启软中断 配置非阻塞延时任务调度函数编写任务调度函数延时任务创建 编译&#xff0c;下载与测试编译下载测试 前两天收到了ST社区的NU…

C数据结构:二叉树

目录 二叉树的数据结构 前序遍历 中序遍历 后序遍历 二叉树的创建 二叉树的销毁 二叉树的节点个数 二叉树叶子节点个数 二叉树第K层节点个数 二叉树的查找 层序遍历 判断二叉树是否为完全二叉树 完整代码 二叉树的数据结构 typedef char BTDataType; typedef str…

Golang的内存关系

1.Page Golang的Page,在操作系统对虚拟内存管理的MMU定义的物理页有相似的定义,默认的Page为8KB 2.mSpan 多个连续的Page称之为是一个Span&#xff0c;其定义含义有操作系统的管理的页表相似 3.Size Class Size Class: 相当于 一个等级和刻度, 比如 第二等级 就代表 一个Pag…

【C++ ——— 多态】笔记

文章目录 一、多态概念二、多态的定义即实现2.1 多态的构成条件2.2 虚函数2.3虚函数的重写1.虚函数中析构函数的重写2.重载、重写&#xff08;覆盖&#xff09;、重定义&#xff08;隐藏&#xff09;的区别 2.4 C11 override 和 final 三、抽象类3.1抽象类概念3.2 接口继承和实…

中断处理过程介绍

概念 中断 中断源 分类 中断处理过程 中断请求 实现器件 中断判优 软件判优 过程 器件实现 程序实现 硬件判优 链路判优 器件实现 控制器判优 中断响应 中断服务 中断返回

C语言作为计算机行业的基础之一,是否制约了行业本身的发展?

c不是计算机行业的基础啦&#xff0c;你想&#xff0c;c语言出现时已经有一套成熟的计算机体系&#xff0c;有基于内存地址的寻找指令、数据的工作方式&#xff0c;有汇编语言&#xff0c;那搞出c这种高级语言就很正常啊&#xff01;刚好我有一些资料&#xff0c;是我根据网友给…

代码随想录算法训练营第20天 |● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

文章目录 前言654.最大二叉树思路方法一 递归法方法一2 老师的优化递归法 617.合并二叉树思路方法一 递归法方法二 迭代法 700.二叉搜索树中的搜索思路方法一 递归法方法二 迭代法 98.验证二叉搜索树思路方法一 使用数组方法二 不使用数组代码注意点&#xff1a; 方法二 使用双…

【Linux】Linux的基本指令_3

文章目录 二、基本指令15. date16. cal16. find17. grep18. zip 和 unzip19. tar20. uname 未完待续 二、基本指令 15. date date 命令可以显示当前时间。 常用标记列表&#xff1a; %H : 小时(00…23) %M : 分钟(00…59) %S : 秒(00…61) %X : 相当于 %H:%M:%S %d : 日 (01……

简易计算器

前言 简易计算器&#xff0c;旨在实现一个简单的计算器功能。 整形&#xff0c;浮点型数据的加减乘除运算&#xff1b;数据的统计(如文件中某字符的出现频数)&#xff1b;期望&#xff0c;方程运算&#xff1b;平均数&#xff0c;最小值&#xff0c;最大值&#xff0c;中位数…

C++之“流”-第2课-C++和C标准输入输出同步

为什么C和C的标准输入输出不同步时&#xff0c;数据会混乱&#xff1f;同步会带来多大性能损失&#xff1f;为什么说这个损失通常不用太在乎&#xff1f; 0. 课堂视频 C之“流”-第2课&#xff1a;和C输入输出的同步 1. 理解cin和cout的类型与创建过程 std::cout 是std::ostre…

Css 提高 - 获取DOM元素

目录 1、根据选择器来获取DOM元素 2.、根据选择器来获取DOM元素伪数组 3、根据id获取一个元素 4、通过标签类型名获取所有该标签的元素 5、通过类名获取元素 目标&#xff1a;能查找/获取DOM对象 1、根据选择器来获取DOM元素 语法&#xff1a; document.querySelector(css选择…

C/C++运行时库和UCRT系统通用运行时库总结及问题实例分享

目录 1、概述 2、不同版本的Visual Studio对应的运行时库说明 3、在Windbg10.0安装目录中获取UCRT通用运行时库 4、微软官网对UCRT通用运行时库的相关说明 5、使用Visual Studio 2017开发软件初期遇到的UCRT通用运行时库问题 6、如何查看软件依赖了哪些C/C运行时库&#…

vueRouter路由总结

https://blog.csdn.net/qq_24767091/article/details/119326884

奇门遁甲古籍《烟奇要览》

《烟奇要览》 全书共178页 时间有限&#xff0c;仅上传部分图片&#xff01;

js深入理解对象的 属性(properties)的特殊 特性(attributes)

对象 js对象 // 构造一个对象 let obj {}; let obj new Object(); 我们知道js中一切皆对象&#xff0c;对象是一个键值对集合&#xff08;key: value)&#xff0c;一个键(key)对应一个值(value)&#xff0c;而每个键都是这个对象的属性&#xff0c;我们可以通过对象的属性来…

在CentOS 8上卸载与安装MySQL 8的详细步骤

关键词&#xff1a;MySQL 8安装、CentOS 8、YUM源配置、卸载MySQL、MySQL残留文件删除、首次登录MySQL临时密码、服务状态检查、MySQL社区服务器 阅读建议&#xff1a;本文适合需要在CentOS 8操作系统上部署最新MySQL 8数据库的系统管理员或开发者阅读。文中步骤简洁清晰&#…