【练习总结】题目:筛法遍历素数(Java)
初学Java,学到流程控制的循环,有个练习题是暴力遍历素数。
因为看过av32186751,知道有个筛法,就想试试。
又受到线性筛法(一)--素数筛法(一) - nerd呱呱 - 博客园中,的这段启发,就有了下面的代码。
引用文字:
我们先定义一个数组来存100000以内数是否的素数,下标表示数,数组的值1表示是素数,0表示不是素数。
我们可以换个角度思考,要找素数,其实只要把不是素数的排除就可以了。
代码:
import java.util.Scanner;
/**
* ShaiFa_Prime__Basic
* @author HmLy.0000
* * * * * * * * * * * * *
*/
public class ShaiFa_Prime__Basic { /**
* 这边,直接用i 来表示"thisNumber[i]" ...
*/
public static void main(String[] args) {
System.out.println();
Scanner scn = new Scanner(System.in);
System.out.println("# 【这是个筛法遍历素数的工具】"); System.out.println("# --> 目前还不能输入同一个数。");
System.out.println("# ");
System.out.println("# ==== -- ==== -- ==== -- ==== ");
System.out.println("# 请指定遍历素数区间范围 : ");
System.out.println("# ---- --- --- ---- --- -- ---- -- -"); boolean[] isPrime_AHA;
int numberArr_i_OP, numberArr_i_ED; while (true) {
System.out.print ("# 指定区间边界<1>, 最少是 2 : | ");
numberArr_i_OP = scn.nextInt();
if (numberArr_i_OP >= 2) {
break;
} else {
System.out.println("# [ERR!!] - === 您输入的值非法,请重新输入!!====");
}//if-else_to_break
}//whileTrue while (true) {
System.out.print ("# 指定区间边界<1>, 最少是 2 : | ");
numberArr_i_ED = scn.nextInt();
if (numberArr_i_ED >= 2) {
break;
} else {
System.out.println("# [ERR!!] - === 您输入的值非法,请重新输入!!====");
}//if-else_to_break
}//whileTrue if (numberArr_i_ED < numberArr_i_OP){
int temp = numberArr_i_ED;
numberArr_i_ED = numberArr_i_OP;
numberArr_i_OP = temp;
}//交换位置 //int largePrim = (numberArr_ED - numberArr_OP + 1);
isPrime_AHA = new boolean[numberArr_i_ED + 1]; for (int i = 0; i <= numberArr_i_ED; i++) {
isPrime_AHA[i] = true;
} isPrime_AHA[0]= false;
isPrime_AHA[1]= false;//先不想办法省掉它俩。。 int nnn_i__tst;
for (int i = 2; i <= numberArr_i_ED; i++) { if(isPrime_AHA[i]){
for (nnn_i__tst = i*2; nnn_i__tst <= numberArr_i_ED; nnn_i__tst++) {
if(nnn_i__tst% i== 0){
isPrime_AHA[nnn_i__tst] = false;
}
}//检查大于2的数是否是其倍数,是,就false。从2 的两倍开始检查 - 因为其前面的必定不是倍数。。。。
}//对所有还没false的进行操作。
}//不光检查2。所有还没false的都得检查。 //打印
System.out.println("# ---- --- --- ---- --- -- ---- -- -");
System.out.println("# 区间为 : |["+ numberArr_i_OP +", "+ numberArr_i_ED +"]");
System.out.println("# 区间长度 : |["+ (numberArr_i_ED +1 - numberArr_i_OP) +"]");
System.out.println("# ---- ---- ---- ---- | ");
int primeCunt = 0;
for (int i = numberArr_i_OP; i <= numberArr_i_ED; i++) {
if (isPrime_AHA[i]) {
primeCunt++;
}
}//数数
System.out.println("# 区间中素数个数 : | "+ primeCunt);
System.out.println("# -- - - ---- --"); for (int i = numberArr_i_OP; i <= numberArr_i_ED; i++) {
if (isPrime_AHA[i]) {
System.out.println("# 区间中的素数 : | "+ i);
}
}//输出
System.out.println("# ---- --- --- ---- --- -- ---- -- -");
}//main
}
/**
* 受到了查到的筛法的启发。
* * * * * * * * * * * * *
* 先前尝试再来个数组,就不用让 i 为 0 和 1
* 的部分被白费,但直接整晕了... 上面这个先简单来,成功了。
*/
为了这个专门预习了数组。
一开始独立写代码,想在开始就不让程序浪费一开始的0和1两个下标,就又弄了一个数组又定义了一堆新变量,然后自己也晕在里面了。。。索性就不管这个,然后就成了。
- - - - - -
对了,一开始的时候弄得那个全是bug的代码似乎还一口气加上了指定遍历开头的功能……
这个的话,是从2开始遍历,只是取值可以设定区间而已,区间只是帮助截取显示的部分,选择小区间并不见得就会减少程序运算量。。。。
- - - - - -
而且,遍历下标倍数的时候上面的代码也弄复杂了。
甭判断这个 % 那个是不是 0 ,直接从 2 到 n 操作一遍 isPrime[i*j] = false ,就成了。。。。
【练习总结】题目:筛法遍历素数(Java)的更多相关文章
- 筛法求素数Java
输出:一个集合S,表示1~n以内所有的素数 import java.util.Scanner; public class 筛法求素数 { public static void main(String[ ...
- JD 题目1040:Prime Number (筛法求素数)
OJ题目:click here~~ 题目分析:输出第k个素数 贴这么简单的题目,目的不清纯 用筛法求素数的基本思想是:把从1開始的.某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉.剩下 ...
- 【九度OJ】题目1163:素数 解题报告
[九度OJ]题目1163:素数 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1163 题目描述: 输入一个整数n(2< ...
- hdu 4548 筛法求素数 打表
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4548 Problem Description 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题 ...
- 2018牛客网暑期ACM多校训练营(第三场) H - Diff-prime Pairs - [欧拉筛法求素数]
题目链接:https://www.nowcoder.com/acm/contest/141/H 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
- <转载>一般筛法和快速线性筛法求素数
素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 ..N^(0.5) ,看看能否整除N. 如果需要判断的次数较多,则先用 ...
- POJ2739_Sum of Consecutive Prime Numbers【筛法求素数】【枚举】
Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19350 Ac ...
- 【九度OJ】题目1047:素数判定 解题报告
[九度OJ]题目1047:素数判定 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1047 题目描述: 给定一个数n,要求判 ...
- 蓝桥杯 算法训练 Torry的困惑(基本型)(水题,筛法求素数)
算法训练 Torry的困惑(基本型) 时间限制:1.0s 内存限制:512.0MB 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7……这样的数叫做质数.Torry突 ...
随机推荐
- 【搜索引擎】Solr最新安装以及通过关系型数据库(MySQL,Oracle,PostgreSQL)导入数据
版本号 最新的solr版本 : Solr 8.1.1下载地址:https://lucene.apache.org/solr/downloads.html solr-8.1.0.tgz for Linu ...
- 巧用MySQL AHI加速神器,让你的InnoDB查询飞起来!
DBAPLUS http://mp.weixin.qq.com/s/cIjQIz-ZngSYJ3k2ZBBSsg
- 【.Net 学习系列】-- Windows身份模拟(WindowsIdentity.Impersonate)时读取Access数据库
参考资料: WindowsIdentity.Impersonate https://msdn.microsoft.com/zh-cn/library/w070t6ka(v=vs.110).aspx A ...
- openstack DVR的AIO 问题
问题描述 : 创建public 网络,创建路由器,并且把路由器的gateway 设置指向网络后有下面几种错误 路由器对应的linux network namespace 建立起来了,但是里面并没有对应 ...
- [Bash] Search for Text with `grep`
In this lesson, we’ll use grep to find text patterns. We’ll also go over some of the flags that grep ...
- Office EXCEL 2010如何取消宏密码保护
打开宏编辑器之后,右击VBA项目,然后属性,保护中去掉密码即可
- libevent API 介绍
基本应用场景也是使用 libevnet 的基本流程,下面来考虑一个最简单的场景,使用livevent 设置定时器,应用程序只需要执行下面几个简单的步骤即可. 1)首先初始化 libevent 库,并保 ...
- 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用
责任链模式的具体应用 1.业务场景 生产车间中使用的条码扫描,往往一把扫描枪需要扫描不同的条码来处理不同的业务逻辑,比如,扫描投入料工位条码.扫描投入料条码.扫描产出工装条码等,每种类型的条码位数 ...
- Linux Shell_test
test: 测试Shell脚本里的条件,通过推出状态返回其结果.用法: test [ expression ] 或 [ [ expression ] ] 注意空格test表达式:是则为真 ...
- RabbitMQ通过shovel插件迁移数据
前言 生产环境中会遇到RabbitMQ数据迁移的场景,例如:切换云服务厂商.不同Region之间数据迁移.新搭建RabbitMQ实例,数据需要同步至新的RabbitMQ实例. 前提条件: 源Rabbi ...