【练习总结】题目:筛法遍历素数(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突 ...
随机推荐
- 2016 ACM/ICPC 区域赛(北京) E 题 bfs
https://vjudge.net/problem/UVALive-7672 题意 输入一个五位数n 问由12345变到n的操作最少次数 不可达输出-1 有三种操作 1.交换相邻的位置 次数不 ...
- Java fail-fast 与 fail-safe 机制对比
关于fail-fast参考这篇文章: 从 modCount 看 java集合 fail-fast 机制 一.fail-safe概述以及与fail-fast区别 首先 fail-safe 并不属于J ...
- DRBD+Heratbeat+NFS高可用文件共享存储
一.概述 .通过ha-log日志可以看出主释放资源,备接管资源. 来自为知笔记(Wiz)
- uva live 12846 A Daisy Puzzle Game
假设下一个状态有必败.那么此时状态一定是必胜,否则此时状态一定是必败 状压DP #include<iostream> #include<map> #include<str ...
- kd树 hdu2966 In case of failure
传送门:pid=2966" target="_blank">点击打开链接 题意:给n个点,求对于每一个点到近期点的欧几里德距离的平方. 思路:看鸟神博客学kd树劲啊 ...
- cocoapods应用第一部分-xcode创建.framework相关
问题的提出: 随着项目的越来越大,可能会出现好几个团队共同维护一个项目的情况,比如:项目组A负责当中的A块,项目组B负责当中的B块.....这几块彼此之间既独立,也相互联系.对于这样的情况,能够採用约 ...
- 转帖:对linux中半增加半连接数量和防止服务器被dos攻击
.增大队列SYN最大半连接数 在Linux中执行命令"sysctl -a|grep net.ipv4.tcp_max_syn_backlog",在返回的"net.ipv4 ...
- Mapreduce运行过程分析(基于Hadoop2.4)——(三)
4.4 Reduce类 4.4.1 Reduce介绍 整完了Map,接下来就是Reduce了.YarnChild.main()->ReduceTask.run().ReduceTask.run方 ...
- Cookie防伪造防修改 电商课题:cookie防篡改
主要防止非法用户修改cookie信息,以及cookie的超时时间 传统cookie存储,Cookie(name, value),value很容易就被篡改. 防修改cookie存储,Cookie(nam ...
- maven导入dom4j以及jaxen.jar报java.lang.UnsupportedOperationException:错误
<dependency> <groupId>jaxen</groupId> <artifactId>jaxen</artifactId> & ...