筛选法与试除法 判断素数

2023-11-05

素数的求解方法

第一种:试除法
第二种:筛选法

------试除法-------
顾名思义:求一个数X是不是素数,就试用小于x大于1区间的自然数,只要有一个能整除,那么x就不是素数,否则就是。

以输出100—200之间的素数为例

#include <stdio.h>
int main()
{
	int i = 1;
	int count = 0; //定义一个计数器来统计素数的个数
	for (i = 100;i <= 200;i++)  
	{
		int j = 2;
		for (j = 2; j < i; j++)
		{
			if (0 == i % j)
				break;  //如果i被整除,则跳出循环,它就不是素数
		}
		if (j >= i)   //判断上面的for循环是break跳出来的,还是变量j不满足j < i而跳出来的
		{             //如果是break跳出来的,就不是素数并且j < i此if语句进不来;如果是j加加导致不满足循环条件跳出来,代表之间没有一个数把i整除,则是素数,进入此if语句打印素数
			count++;
			printf("%d ", i);
		}
	}
	printf("\n素数的个数是%d个\n", count);
	return 0;
}

上面这个算法时间复杂度很大的,是相当的慢,因为每判断一个数就要用大于1小于这个数区间的其他自然数一一试除。如果这个素数非常大,那么就要除很多很多次才能判断出来。

优化上面程序
想一想,每一个数都可以由它的两个因数相乘得来,那么它的两个因数有什么特点呢?比如x它的两个因数必有一个因数小于x/2。
为什么?你想想x的一半x/2加上它的另一半x/2等于它本身,两个x/2相加等于x,那么两个x/2相乘一定大于或者等于x本身;要想找两个因数相乘等于x,那么必定要有一个因数小于等于x/2,才会满足条件。
那么判断一个数是不是素数我们其实只需要找到它的一个因数就可以证明它不是素数,而不需要找到它的所有因数。我们从2到x/2找到一个即可,找到就是合数,否则是素数。则上面程序的第二个for循环的控制条件可以改成 j<=i/2,第二个if判断条件改成 j>i/2,这样就减少了一半的试除。

#include <stdio.h>
int main()
{
	int i = 1;
	int count = 0;
	for (i = 100;i <= 200;i++)
	{
		int j = 2;
		for (j = 2; j <= i/2; j++)
		{
			if (0 == i % j)
				break;
		}
		if (j > i/2)
		{
			count++;
			printf("%d ", i);
		}
	}
	printf("\n素数的个数是%d个\n", count);
	return 0;
}

再优化
其实一个数由两个因数相乘得来,则必有一个因数小于等于这个数的开平方,这样试除的数比原来x/2又减少了;我们也可以对for(i = 100;i <=200;i++)改进,既然判断素数,那么偶数一定不是素数,我们可以跳过每个偶数判断剩余的数是不是素数,这样要判断的数也减少了一半。

#include <stdio.h>
#include <math.h>    //用到sqrt库函数,要引用相应的头文件
int main()
{
	int i = 1;
	int count = 0;
	for (i = 101;i <= 200;i+=1)  //跳过每一个偶数
	{
		int j = 2;
		for (j = 2; j <= sqrt(i) ; j++)  
		{
			if (0 == i % j)
				break;
		}
		if (j > sqrt(i))
		{
			count++;
			printf("%d ", i);
		}
	}
	printf("\n素数的个数是%d个\n", count);
	return 0;
}

筛选法
公元前250年古希腊的数学家埃拉托塞尼提出一种筛法:
百度百科是这样解释的:
筛选法又称筛法,具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。(另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。)

此处以输出1—100之间的素数为例
(将不是素数的值直接改为0,代表已经筛去)
第一步:先定义并初始化一个数组1—100
第二步:1不是素数,直接筛去,将其赋值为0
第三步:从2开始,2是素数保留,然后依次用2后面的数去除2,能被2整除则不是素数,赋值为0;
第四步:接下来是3,因为上一步没有被2整除,保留,接着第三步的操作,用3后面的数去除3,能被3整除的数则不是素数,赋值为0
第五步:4第二步已经被2整除赋值为0了,不用管,接着是5,保留依次循环上述操作,直到某个数后面没有要筛选的数为止

#include <stdio.h>
#include <math.h>
int main()
{
	int count = 0;
	int arr[100] = { 0 };  //先将其初始化为0
	int i = 0;
	for (i = 0; i < 100; i++) //给数组赋值1—100
	{
		arr[i] = i + 1;
	}
	//开始筛选
	arr[0] = 0; // 1不是素数直接赋值为0,筛选去
	for (i = 1; i <= sqrt(100); i++)  //其实只需要用2到最大的那个数(这里最大的数是100)开方之间的数去筛选就可以,因为它总有一个因数不会超过它的开平方,前面已经讲过.既然最大的那个数的因数都包含在范围内,那么比它小的那些数因数也一定在范围内。
	{
		if (0 != arr[i])  //判断是否是前面筛选保留下来的数
		{
			int j = 0;
			for (j = i + 1; j < 100; j++)
			{
				if (0 != arr[j])  //判断是否已经被筛选过
				{
					if (0 == arr[j] % arr[i])
						arr[j] = 0;
				}
			}
		}
	}
	//晒选结束,打印素数
	for (i = 0; i < 100; i++)
	{
		if (arr[i] != 0)
		{
			count++;
			printf("%d ",arr[i]);
		}
	}
	printf("\ncount = %d\n", count);
	return 0;
}

上述编码不是唯一,如有不对的地方或者疑问,欢迎来扰!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

筛选法与试除法 判断素数 的相关文章

  • AD16 如何锁定多根线 DDR3

    如何在altium designer中快速的锁定一整条信号线 如下图的DDR3走线 咱们随意选择一条 当你点击的时候 只能选中一部分 一 按下 Ctrl H 快捷键后 鼠标点击到要选中的线 你会发现 和这个线相关的线 过孔都被选中 如箭头所

随机推荐

  • 猴子爬山【Java】

    猴子爬山 Java 一天一只顽猴想去从山脚爬到山顶 途中经过一个有个N个台阶的阶梯 但是这猴子有一个习惯 每一次只能跳1步或跳3步 试问猴子通过这个阶梯有多少种不同的跳跃方式 输入描述 输入只有一个整数N 0
  • lora:low-rank adaption of large language models

    THUNLP 领读 ICLR 低秩微调大模型 LoRA OpenBMB论文速读 第3期 哔哩哔哩 bilibili 用脑图 十分钟 OpenBMB 论文速读 第3 期来了 本期领读人是清华大学自然语言处理实验室的本科生 带大家高效读完一篇关
  • 算法训练营第二十八天(8.11)

    目录 LeeCode 455 Assign Cookies LeeCode 376 Wiggle Subsequence LeeCode 53 Maximum Subarray LeeCode 455 Assign Cookies 题目地址
  • hbuilder webapp支付宝app支付

    前言 支付类的东西都是按照官方写的文档一步一步来就可以搞定 关键就是第一次弄 一脸懵 不成功就很烦躁 这次项目用的是hbuilder打包的app方式 框架用的是mui 其实app支付的重点就是在签名这块 官方有工具可以验签 一般签名不错的话
  • Java学习之抽象类&接口

    一 抽象类 1 抽象类的概述 一个没有方法体的方法应该定义为抽象方法 而类中如果有抽象方法 该类必须定义为抽象类 2 抽象类的特点 抽象类和抽象方法必须使用 abstract 关键字修饰 抽象类的定义 public abstract cla
  • 回归方法--一元回归,多元回归,逐步归回,Logistic 回归

    数学建模专栏 第三篇 MATLAB数据建模方法 上 常用方法 2017 07 21 卓金武 MATLAB 作 者 简 介 卓金武 MathWorks中国高级工程师 教育业务经理 在数据分析 数据挖掘 机器学习 数学建模 量化投资和优化等科学
  • Linux上如何查看某个进程的线程

    问题 我的程序在其内部创建并执行了多个线程 我怎样才能在该程序创建线程后监控其中单个线程 我想要看到带有它们名称的单个线程详细情况 如 CPU 内存使用率 线程是现代操作系统上进行并行执行的一个流行的编程方面的抽象概念 当一个程序内有多个线
  • JAVA中&&和两种符号

    可以用作逻辑与的运算符 表示逻辑与 and 当运算符两边的表达式的结果都为true时 整个运算结果才为true 否则 只要有一方为false 则结果为false 还具有短路的功能 即如果第一个表达式为false 则不再计算第二个表达式 例如
  • uni-app 微信小程序 onReachBottom 不生效

    问题描述 uni app 微信小程序 页面滑到底部 onReachBottom 没有生效 代码 pages json 配置 path style navigationBarTitleText 列表 onReachBottomDistance
  • 配置nginx服务器需要修改的配置文件为,01_Nginx安装,nginx下部署项目,nginx.conf配置文件修改,相关文件配置...

    1 下载Nginx 进入Nginx下载地址 http nginx org 2 下载pcre 这个是一个正则表达式的库 Nginx做rewriter的时候回用到这个库 进入pcre的官网 rewrite模式需要pcre http www pc
  • C语言的算法渐进分析

    C语言的基本结构 C语言由头文件组成 在C语言的源代码中有多个源文件 每一个源文件中包含了主函数 库函数以及自动以函数 源程序中可以有多个源文件 但是在运行的过程中只能有一个主函数 并且只能从主函数开始执行 C语言的格式为一行一句 在源程序
  • Android冷启动优化解析,flutter瀑布流列表

    TotalTime 242 WaitTime 288 Complete ThisTime 是指调用过程中最后一个Activity启动时间到这个Activity的 startActivityAndWait调用结束 TotalTime 是指调用
  • 云计算背后的秘密:NoSQL诞生的原因和优缺点

    聊聊为什么NoSQL会在关系型数据库已经非常普及的情况下异军突起 诞生的原因 随着互联网的不断发展 各种类型的应用层出不穷 所以导致在这个云计算的时代 对技术提出了更多的需求 主要体现在下面这四个方面 1 低延迟的读写速度 应用快速地反应能
  • TiDB介绍

    目录 TiDB 简介 一 四大核心应用场景 二 TiDB 整体架构 三 TiDB 数据库的存储 Key Value Pairs 键值对 本地存储 RocksDB Raft 协议 Region MVCC 分布式 ACID 事务 参考 TiDB
  • 002-数据结构之算法的时间复杂度和空间复杂度

    一 概述 对于同一个问题来说 可以有多种解决问题的算法 尽管算法不是唯一的 但是对于问题本身来说相对好的算法还是存在的 这里可能有人会问区分好坏的标准是什么 这个要从 时效 和 存储 两方面来看 好的算法应该具备时效高和存储低的特点 这里的
  • 美团二面:如果每天有百亿流量,你如何保证数据一致性?

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 前情提示 什么是数据一致性 一个数据计算链路的梳理 数据计算链路的bug 电商库存数据的不一致问题 大型系统的数据不一致排查有多困难 一 前情提示 这篇文章 咱
  • 顺序查找算法C语言实现

    顺序查找算法 实现思想 静态查找表用顺序存储结构表示时 顺序查找的查找过程为 从表中的最后一个数据元素开始 逐个同记录的关键字做比较 如果匹配成功 则查找成功 反之 如果直到表中第一个关键字查找完也没有成功匹配 则查找失败 应用场景 顺序查
  • SpringBoot-基础-10-自动配置类常用注解

    SpringBoot 基础 10 自动配置类常用注解 一 自动配置类 XXXAutoConfiguration XxxxAutoConfiguration类的含义是 自动配置类 目的是给容器中添加组件 从上示例中 我们可以了解到自动配置类常
  • HTML标题

    目录 HTML 标题 实例 标题很重要 HTML 水平线 实例 HTML 注释以及在PyCharm中快速添加注释 实例 HTML 提示 如何查看源代码 来自本页的实例 HTML 标签参考手册 一个完整的实例 在 HTML 文档中 标题很重要
  • 筛选法与试除法 判断素数

    素数的求解方法 第一种 试除法 第二种 筛选法 试除法 顾名思义 求一个数X是不是素数 就试用小于x大于1区间的自然数 只要有一个能整除 那么x就不是素数 否则就是 以输出100 200之间的素数为例 include