【练习总结】题目:筛法遍历素数(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突 ...
随机推荐
- Django学习之 - 基础视图函数
视图:Views 获取用户请求的方法: 1: request.GET 2: request.POST 3: request.FILES # checkbox 等多选文件 4:request.POST. ...
- 动态规划:Monkey and Banana
Problem Description A group of researchers are designing an experiment to test the IQ of a monkey. T ...
- P1093||T1142 奖学金 洛谷||codevs
http://codevs.cn/problem/1142/ || https://www.luogu.org/problem/show?pid=1093 题目描述 某小学最近得到了一笔赞助,打算拿出 ...
- Flatten Binary Tree to Linked List (DFS)
Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 6 T ...
- mysql写入数据乱码问题的解决
mysql默认编码为latin. 我的mysql版本为5.6.安装路径下没有my.ini,但是有my-default.ini.其实mysql没有配置文件也是可以启动的,但是为了设置编码,需要将my-d ...
- Go---设计模式(策略模式)
策略模式定义了算法家族,在调用算法家族的时候不感知算法的变化,客户也不会受到影响. 下面用<大话设计模式>中的一个实例进行改写. 例:超市中经常进行促销活动,促销活动的促销方法就是一个个策 ...
- topcoder srm 553
div1 250pt: 题意:... 解法:先假设空出来的位置是0,然后模拟一次看看是不是满足,如果不行的话,我们只需要关心最后栈顶的元素取值是不是受空白处的影响,于是还是模拟一下. // BEGIN ...
- Android 自己定义UI文章汇总
<Android ListView分类/分组效果 - 第一种实现方式> <Android ListView分类/分组效果 - 另外一种实现方式> <Android Lis ...
- SQL yog过期后教你怎么让他不过期
打开注册表 安装sqlyog后,进入注册表编辑器,进入\HEYK_CURRENT_USER\Software\,找到以{}括起来的那项直接干掉! 1, regedit 2,修改 3,
- JNI/NDK开发指南(2)
1.生成动态库.so,存放于手机的system/lib/中(APP怎样将.so存入该文件夹,奇怪?????),Java层调用JNI的类会运行静态代码System.loadLibrary("* ...