【练习总结】题目:筛法遍历素数(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突 ...
随机推荐
- FastDfs + Dht 搭建笔记
以下为搭建一套分布式文件集群系统,参考了很多资料,自己经过在服务器上搭建并且经过了测试.记录以方便以后使用查看. FastDfs + Dht 安装手册 一:概述 FastDFS是由淘宝的余庆先生所开发 ...
- HDU3549 最大流 裸题
EK算法 时间复杂度o(n*m*m) 因为有反向边每次bfs时间为 n*m 每次删一条边 最多m次 代码 #include<iostream> #include<string.h& ...
- Java中的字符
以下内容引用自http://wiki.jikexueyuan.com/project/java/characters.html: 一般情况下,当处理字符时,使用的是原始数据类型char. 示例: ch ...
- C语言取整方法总结
C语言有下面几种取整方法: 1. 直接赋值给整数变量 int i = 3.5; 或 i = (int) 3.5; 这样的方法採用的是舍去小数部分. 2.整数除法运算符' / '取整 ' / ...
- 使用引导光盘,将你的PC变身瘦客户机
很多国内使用VMware View桌面虚拟化产品的朋友问我,是否可以将自己现有的PC改造成一台瘦客户机呢? 一方面即可以得到桌面虚拟化的管理,安全的好处,而且连前端PC机的系统管理的工作都省了? 答案 ...
- 重载OverLoad。隐藏new
<1> using System; using System.Collections.Generic; using System.Linq; using System.Text; name ...
- ubuntu 安装后要做的事情
1. 安装chrome,软件中心就可以. 2. 安装vim 和一些插件.这里引入一大牛配置的插件集 sudo apt-get install vim-gtk wget -qO- https://raw ...
- 原生ajax请求和jsonp
1.原生ajax请求 var obj = new XMLHttpRequest(); obj.open("POST", url, true); obj.setRequestHead ...
- SQL Server 多库操作 库名.dbo.表名 出错的问题!
SQL Server 多库操作 库名.dbo.表名 出错的问题! 数据库名不要用数字开头. 例如:343934.dbo.user 这就会出错.md a343934.dbo.user 就没问题!! 记住 ...
- Count on an IEnumerable<dynamic>
http://stackoverflow.com/questions/7733305/count-on-an-ienumerabledynamic int count = Enumerable.Cou ...