当前位置: 首页 > ops >正文

总结一下找素数的三种方法

目录

一试除法

二埃氏筛

三线性筛(欧拉筛)


一试除法

思想:就是判断某个数x是不是素数,就判断从2开始到小于=根号x的范围内有没有能够取余不等于0的,这个说明当前值就是x的一个因子,所以不是素数。

代码:

import java.util.Scanner;public class Javava {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("求0~300之间的素数:");pan1();//试除法sc.close();}private static void pan1() {int total = 0;for (int i = 2; i <= 300; i++) {int j;for( j = 2; j*j <= i; j++) {if(i%j==0){break;}}if(j*j>i){System.out.println(i+" ");total ++;}}System.out.println("共有"+total+"个");}
}

二埃氏筛

思想:从小到大开始判断素数,当前x是素数,那么x*x 及以后得x*x+n*x都不在会是素数了,直接排除即可,使用一个boolean型的辅助数组即可

代码:

import java.util.Scanner;public class Javava {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("求0~300之间的素数:");pan2();//埃氏筛sc.close();}private static void pan2() {int total = 0;boolean [] arr = new boolean[300];for (int i = 2; i < arr.length; i++) {if(arr[i]==false){for(int j=i*i;j<arr.length;j+=i){arr[j]=true;}}}System.out.println("素数有");for (int i = 2; i < arr.length; i++) {if(arr[i]==false){System.out.print(i+" ");total++;}}System.out.println();System.out.println("共有"+total+"个");}
}

三线性筛(欧拉筛)

思想:因为第二个埃氏筛有重复标记的,也是浪费性能,线性筛是对埃氏筛的进一步优化

代码:

ArrayList

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;public class Javava {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("求0~300之间的素数:");pan3();//欧拉筛sc.close();}private static void pan3() {int total = 0;boolean [] arr = new boolean[301];ArrayList<Integer> list = new ArrayList<>();for (int i = 2; i < arr.length; i++) {if(arr[i]==false)list.add(i);for(int j=0;j<list.size()&&i*list.get(j)<=300;j++){arr[i*list.get(j)]=true;if(i%list.get(j)==0){break;}}}System.out.println("素数有");for(int val:list){System.out.print(val+" ");}System.out.println();System.out.println("共有"+list.size()+"个");}
}

二:纯粹数组

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;public class Javava {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("求0~300之间的素数:");pan3();//欧拉筛sc.close();}private static void pan3() {int total = 0;boolean [] arr = new boolean[301];
//        ArrayList<Integer> list = new ArrayList<>();int [] list = new int[301];int idx = 0;for (int i = 2; i < arr.length; i++) {if(arr[i]==false)list[idx++] = i;for(int j=0;j<=idx&&i*list[j]<=300;j++){arr[i*list[j]]=true;if(i%list[j]==0){break;}}}System.out.println("素数有");for(int val:list){System.out.print(val+" ");}System.out.println();System.out.println("共有"+(idx)+"个");}
}

http://www.xdnf.cn/news/15345.html

相关文章:

  • 【Bluedroid】蓝牙协议栈enable流程深度解析
  • 若依(RuoYi)框架项目结构全解析
  • [Dify]-进阶1- Dify 支持的多种 AI 模型解析与选择建议
  • Linux修炼:自动化构建make/Makefile
  • sshpass原理详解及自动化运维实践
  • 微软发布BioEmu模型
  • 【FPGA】AXI总线协议
  • 动态规划题解——单词拆分【LeetCode】
  • VScode链接服务器一直卡在下载vscode服务器,无法连接成功
  • 企业数字化资产管理安全、成本、协作困局难解?
  • MYSQL数据库----DCL语句
  • Linux进程状态实战指南:转换关系、监控命令与状态解析
  • 从代码学习深度强化学习 - DDPG PyTorch版
  • python赤道上空的大气环流剖面图(纬向-高度剖面)
  • 代理模式:控制对象访问
  • Spring AI 项目实战(十七):Spring Boot + AI + 通义千问星辰航空智能机票预订系统(附完整源码)
  • 无缝衔接直播流体验
  • 数据结构 单链表(1)
  • Acrobat 表单中的下拉菜单(附示例下载)
  • ESP-Timer入门(基于ESP-IDF-5.4)
  • 插入类排序的C语言实现
  • Java小白-设计模式
  • C#单例模式管理全局变量
  • OSPF与BGP的联动特性实验案例
  • OSPF与BGP的联动特性
  • Java设计模式之行为型模式(命令模式)
  • 单例模式:确保全局唯一实例
  • Vue文件上传实战指南
  • 【OpenGL 渲染器开发笔记】1 为什么要设计渲染器?
  • Dubbo-Admin 安装与使用指南:可视化管理 Dubbo 服务