输出不大于N的素数的个数

Sieve of Eratosthenes 方法 

素数的性质: 非素数可以分解为素数乘积。

证明 (1)n = 2 成立,n = 3 成立;

(2)若 n = k 时成立,n = k+1时,假设 n = k+1 = k1*k2, 如果 k+1 是素数,k1 = 1, k2 = K+1, 成立;

如果 k+1不是素数,k1 <= k, k2 <= k, 两者都可以表示为素数乘积,所以 k+1可以表示为素数乘积。
其它细节见程序注释,

public class PrimeSieve {
public static void main(String[] args) {
int N = Integer.parseInt(args[0]); // initially assume all integers are prime
boolean[] isPrime = new boolean[N + 1];
for (int i = 2; i <= N; i++) {
isPrime[i] = true;
} // mark non-primes <= N using Sieve of Eratosthenes
for (int i = 2; i*i <= N; i++) { // 假设 N = k1 * k2, k1 和 k2 中一定有一个是小于等于 sqrt(N) 的,所以只要考虑 i 属于 [2..floor(sqrt(N))]就可以了 // if i is prime, then mark multiples of i as nonprime ** 如果 i 是素数,那么将 i 的倍数都标记为非素数
// suffices to consider mutiples i, i+1, ..., N/i ** j 最小是 i, 因为执行到这一步,已经排除了以 [2..i-1] 为因数的非素数。 2*i,3*i,4*i,...,(i-1)*i 都已经被排除了。 j 最大是 N/i, 因为要保证 i * j <= N
if (isPrime[i]) { //
for (int j = i; i*j <= N; j++) {
isPrime[i*j] = false;
}
}
} // count primes
int primes = 0;
for (int i = 2; i <= N; i++) {
if (isPrime[i]) primes++;
}
System.out.println("The number of primes <= " + N + " is " + primes);
}
}

运行结果: 小于 25的素数的个数 pi(25) = 9, 分别是 2 3 5 7 11 13 17 19 23

输出不大于N的素数的个数的更多相关文章

  1. 求n到m之间素数的个数

    Description 求n到m之间素数的个数 Input 多组测试数据,每组先输入一个整数t,表示组数,然后每组输入2个正整数n和m,(1 <= n <= m <= 10000) ...

  2. 查找2-n之间素数的个数

    题目描述 查找2-n之间素数的个数.n为用户输入值.素数:一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数.如2,3,5,7,11,13,17…. 输入 整数n 输出 2-n ...

  3. 【Python实践-7】输出100以内的所有素数

    #输出100以内的所有素数,素数之间以一个空格区分(注意,最后一个数字之后不能有空格). i= l=[] : k= ,i): : k=k+ : l.append(i) i=i+ print(" ...

  4. JAVA面试题:输出100以内所有的素数

    转载:https://www.cnblogs.com/onway/archive/2012/11/15/2771912.html Java输出1-100中所有的素数 很多人笔试时都会遇到这个问题,小农 ...

  5. 埃氏筛法(快速筛选n以内素数的个数)

    给你一个数n,请问n以内有多少个素数?(n <= 10e7) 一般来说,要是对一个整数进行素数判断,首先想到的是写个函数判断是否为素数,然后调用这个函数,时间复杂度为O(n^(½)),但是要求n ...

  6. shell ping一个IP,延时大于5,输出延时大于5s,打印输出

    # ping一个IP,延时大于5,输出延时大于5s,打印输出 #!/bin/bash ip=$* echo $ip num=`ping  -c 10 ${ip}|grep icmp_seq|awk ' ...

  7. [leetcode] 204. Count Primes 统计小于非负整数n的素数的个数

    题目大意 https://leetcode.com/problems/count-primes/description/ 204. Count Primes Count the number of p ...

  8. 求小于10000的素数的个数 Exercise06_10

    /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:求小于10000的素数的个数 * */ public class Exercise06_10 { public static ...

  9. 用算法求N(N&gt;=3)之内素数的个数

    首先.我们谈一下素数的定义.什么是素数?除了1和它本身外,不能被其它自然数整除(除0以外)的数 称之为素数(质数):否则称为合数. 依据素数的定义,在解决问题上,一開始我想到的方法是从3到N之间每一个 ...

随机推荐

  1. Linux下Java环境变量设置

    我用的是oh my zsh,需要修改.zshrc,记一下免得以后忘记在哪儿改的. 如果你用的是自带的terminal那么用文本编辑器打开用户目录下的.bash_profile文件 在.bash_pro ...

  2. Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器

    函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  3. 存储过程实例总结(开发中的错误与总结,调试,数据库函数DATEDIFF计算当前日期是否在本周内)

    USE [POND] GO /****** Object: StoredProcedure [dbo].[OrderChargeList] Script Date: 04/16/2014 13:32: ...

  4. 让你的Ubuntu也能像Windows那样显示网速和CPU温度

    致力于Linux桌面操作系统的平民化,一直强迫自己完全在Ubuntu系统下进行日常的电脑使用,但是用长了时间的Windows,还是有些习惯改不过来,比如只要在下载或者看在线视频的时候就会不自觉关注网速 ...

  5. Ubuntu的which、whereis、locate和find命令

    which 只能寻找执行文件 ,并在PATH变量里面寻找. whereis 从linux文件数据库(/var/lib/slocate/slocate.db)寻找,所以有可能找到刚刚删除,或者没有发现新 ...

  6. Centos6.4_X64飞信安装

  7. Java编程常见问题汇总

    每天在写Java程序,其实里面有一些细节大家可能没怎么注意,这不,有人总结了一个我们编程中常见的问题.虽然一般没有什么大问题,但是最好别这样做.另外这里提到的很多问题其实可以通过Findbugs( h ...

  8. oracle启动

  9. Shell脚本高级应用 --实现远程MySQL自动查询[转

    #!/bin/sh Host=192.168.5.30 User=abccdef PW=123456 MSG=`mysql -h$Host -u$User -p$PW <<EOF show ...

  10. Mysql Binlog 三种格式介绍及分析

    一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...