题目:统计素数个数。

素数:只能被1和自身整除的数,0、1除外

解法一:暴力算法

public class Sushu {public static void main(String[] args) {System.out.println(countPrimes(100));}public static int countPrimes(int n) {int ans = 0;for (int i = 2; i < n; ++i) {ans += isPrime(i) ? 1 : 0;}return ans;}/*** 是否为素数*/public static boolean isPrime(int x) {for (int i = 2; i < x; ++i) {//除了1和自身的任意数,取模存在等于0的,则非素数if (x % i == 0) {return false;}}return true;}
}结果:100以内有25个素数

冷知识:for循环第3语句块 ++i 和 i++效果一样,但是 ++i 性能好一些。i++由于是在使用当前值之后再+1,所以需要一个临时的变量来转存。

即使暴力破解,也是有优化空间的。
上面的程序 isPrime ,在 x = 素数时,例11,需要遍历9次( 11%2 11%3 11%4 11%5 11%6 11%7 11%8 11%9 11%10)才能知道这个数字是素数。我们可以利用开根号的方式,减少遍历次数。

//i如果能被x整除,则x/i肯定能被x整除,因此只需判断i和根号x之中较小的即可public boolean isPrime(int x) {for (int i = 2; i * i <= x; ++i) {if (x % i == 0) {return false;}}return true;}

说明:
11%2 理解为 11/2 = 5 , 11%3 理解为 11/3 = 3,11/4 = 2,之后的 11/5 = 2 其实和最开始的 11/2是没有区别的,所以实际上没有必要再去算 11/5 之后的程序,可以理解为开根号是为了得到临界值

故使用根号推算: 由原来的 i < x 变为 i < √x (也可以使用 Math中的根号方法),此处我们没有用,所以左右一起加平方,即 i * i <= x

解法二:埃式筛选法

例 2 * 3,2 * 4 ,肯定等于非素数(合数),所以我们的目标就是省去合数的遍历次数。

public class Sushu {public static void main(String[] args) {System.out.println(eratosthenes(100));}public static int eratosthenes(int n) {boolean[] isPrime = new boolean[n];//初始假定小于n的所有数都为素数Arrays.fill(isPrime,true);int ans = 0;for (int i = 2; i < n; i++) {if (isPrime[i]) {ans += 1;for (int j = i * i; j < n; j += i) {isPrime[j] = false;}}}return ans;}
}

布尔数组初始都为false,为了便于理解,可以用Arrays.fill(booleans,true);将值都改为true

2.统计素数(质数)个数相关推荐

  1. hdu2.1.2 How many prime numbers(计算素数的个数)

    给出一系列的数,统计素数的个数 思路:因为数据的范围为2^31-1,先计算出[2,sqrt(2^31-1]之间的素数primes.在判断给出的数num是否是素数时,只需要判断num是否能被primes ...

  2. 求一千万以内的所有素数的个数

    本文主要介绍的是"埃氏筛法". 素数筛法的关键在于一个"筛"字.其基本思路是,从2开始,对所有的素数,筛去它所有的倍数.我们唯一需要知道的是2是一个素数. 设置 ...

  3. C语言编程练习:统计素数并求和

    文章目录 题目描述 思路 结果 题目描述 本题要求统计给定整数M和N区间内素数的个数并对它们求和. 输入格式: 输入在一行中给出2个正整数M和N( 1<=M<=N<=500 ). 输 ...

  4. java中如何求101-200之间的素数,并统计素数个数

    素数,又叫质数,如果一个数只能被1和它本身整除,name这个数就是叫做质数,也叫做素数 最小数的质数是3,1既不是质数,也不是合数 采用双重for循环的方式判断 public class SuShu ...

  5. 洛谷 P1865 A % B Problem[筛素数/前缀和思想/区间质数个数]

    题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对于每次询问输出个数 t,如l或r∉[1,m]输出 Cros ...

  6. 代码实现:判断101-200之间有多少个素数(质数),并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。...

    package com.heima.Coding;/*判断101-200之间有多少个素数(质数),并输出所有素数.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明 ...

  7. 1,判断一个数是不是质数。 2,选取出100以上、1000以内所有个位数字与十位数字之和被10除所得余数恰好是百位数字的素数(如293).输出上述这些素数的个数及这些素数的和.

    对于大于 1 的数,如果除了 1 和它本身,它不能再被其它正整数整除,那么我们说它是一个质数.晓萌想判断一个数是不是质数,希望找你写个程序,帮助她进行判断. 输入格式 输入包括一行,为一个整数 N(1 ...

  8. 求质数个数(求素数个数

    以洛谷p3912为例 题目描述 求 1,2,⋯,N 中素数的个数. 输入格式 一行一个整数 N. 输出格式 一行一个整数,表示素数的个数. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数 ...

  9. 统计素数并求和 (20 分)本题要求统计给定整数M和N区间内素数的个数并对它们求和。

    本题要求统计给定整数M和N区间内素数的个数并对它们求和. 输入格式: 输入在一行中给出两个正整数M和N(1≤M≤N≤500). 输出格式: 在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以 ...

最新文章

  1. 机器学习中的集成学习模型实战完整讲解
  2. python的翻译-python写的翻译代码
  3. Kafka 教程(二) 集群搭建和容错性测试
  4. mybatis的批量操作
  5. JAVA中流水账的实现_流水账式java基础Summary
  6. 大盘点|卷积神经网络必读的 100 篇经典论文,包含检测 / 识别 / 分类 / 分割多个领域
  7. iss版本服务器读取_Netty每次读取客户端数量
  8. 【重难点】【RabbitMQ 02】如何避免消息重复投递和消息重复消费、如何防止消息丢失、如何保证消息的顺序性、如何保证消息队列的可用性
  9. 【Elasticsearch】 es 7.6 索引墓碑
  10. mysql免安装版配置百度_mysql -5.7.10 免安装版配置
  11. 机器学习EPD:概率密度估计
  12. 【优化算法】学生心理学优化算法(SPBO)【含Matlab源码 1430期】
  13. Java编写HTTP请求发送XML报文数据
  14. 三菱FX5U rtu方式通讯两台施耐德ATV320变频器
  15. 移动100兆光纤,白天速度快,到了晚上卡成狗,何解?
  16. Flink Watermark机制
  17. 云联惠创业经营者认证_广州公安打掉云联惠涉传销组织 零壹财经曾发文警示...
  18. 铝巨人铝模软件_助力建筑工业化发展PKPM-LMB铝模设计软件正式发布
  19. ps滤镜之旋转扭曲算法实现
  20. 【青龙面板】天翼云盘签到

热门文章

  1. 第三方支付 拉卡拉支付相关的坑
  2. 64位ubuntu能安装mysql,在ubuntu14.04 64位虚拟机中安装mysql
  3. 软件测试的概念及详细分类的介绍
  4. 写日记,是一个好习惯!
  5. 工控安全漏洞数大爆发,我国企业要如何掘金?
  6. python语法分析器(parser)源码阅读(三)
  7. mc官方认证服务器_有关MC *认证的更多信息*
  8. 今天大量安卓应用发生闪退,原来是它搞的鬼
  9. 分布式缓存 redis 问题(1)
  10. (模块化)Finding and evaluating community structure in net work