素数个数统计算法

题目要求:统计n以内的素数个数
测试:n等于100为例

暴力算法

public class Sushu {
	public static void main(String[] args) {
		System.out.println(bf(100));
	}
	//暴力算法
	public static int bf(int n) {
		int count = 0;
		for(int i = 2;i < n;i++) {
			count += isPrime(i) ? 1:0;
		}
		return count;
	}
	
	private static boolean isPrime(int x) {
		for(int i = 2;i < x;i++) {
			if(x % i == 0) {
				return false;
			}
		}
		return true;
	}
}

存在的问题

暴力算法的时间复杂度是比较大的,可以进行以下的优化。
实际上,在isPrime函数中,for循环内判断条件可以直接改为i * i <= x,这是因为前半部分和后半部分是重复的。

埃氏筛选

主要思想:将所有的数放入布尔数组并做上标记,如果判断出已经是素数,那么它的倍数均不是素数,直接将其标记为true。

public class Sushu {
	public static void main(String[] args) {
		System.out.println(eratosthenes(100));
	}
	private static boolean isPrime(int x) {
		for(int i = 2;i < x;i++) {
			if(x % i == 0) {
				return false;
			}
		}
		return true;
	}
	
	//埃氏筛法
	public static int eratosthenes(int n) {
		//创建bool类型的数组作为标记位
		boolean[] isPrime = new boolean[n]; //false代表素数
		int count = 0;
		for(int i = 2; i < n; i++) {
			if(!isPrime[i]) {
				count++;
				//j是合数的标记位
				for(int j = 2 * i;j < n;j+=i) {
					isPrime[j] = true;
				}
			}
		}
		return count;
	}
}

优化

	public static int eratosthenes(int n) {
		//创建bool类型的数组作为标记位
		boolean[] isPrime = new boolean[n]; //false代表素数
		int count = 0;
		for(int i = 2; i < n; i++) {
			if(!isPrime[i]) {
				count++;
				//j是合数的标记位
				//优化:将j的初始条件改为i*i,因为每次都从2*i开始会造成重复的标记
				for(int j = i * i;j < n;j+=i) {
					isPrime[j] = true;
				}
			}
		}
		return count;
	}

测试结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是输出300以内的所有素数,并统计个数的代码: ```python count = 0 for num in range(2, 301): is_prime = True for i in range(2, num): if num % i == 0: is_prime = False break if is_prime: print(num) count += 1 print("共有", count, "个素数") ``` 输出结果为: ``` 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 共有 62 个素数 ``` ### 回答2: 要输出300以内的所有素数并统计个数,我们可以使用"试除法"来判断一个数字是否为素数。基本思路是,对每个数字n,从2到√n逐个进行试除,如果存在能整除n的因数,则n不是素数;若不存在能整除n的因数,则n是素数。 首先,我们设定一个计数器count,用于统计素数个数。然后,从2开始,逐个判断每个数字n是否为素数。 对于每个n,使用循环从2到√n进行试除。若存在能整除n的因数,则立即退出循环,n不是素数;若不存在能整除n的因数,则n是素数。此时,将计数器count加1,并输出当前的素数n。 最后,我们将计数器count的值输出,即为300以内的素数个数。 以下是完整的代码程序: ```python import math count = 0 for n in range(2, 301): is_prime = True for i in range(2, int(math.sqrt(n)) + 1): if n % i == 0: is_prime = False break if is_prime: count += 1 print(n) print("300以内的素数个数为:", count) ``` 运行上述代码,将会输出300以内的所有素数,并统计个数。 ### 回答3: 素数又称质数,指的是只能被1和自身整除的正整数。根据题目要求,我们需要输出300以内的所有素数,并统计个数。 为了判断一个数是否为素数,可以采用试除法,即将待判断的数从2开始依次除以2到根号n之间的所有数,如果有能整除的数,那么该数就不是素数。根据筛选法,4以下的质数分别是2和3。 根据上述算法,我们可以编写一个简单的程序来输出300以内的所有素数,并统计个数: ```python count = 0 # 初始化素数个数为0 # 循环遍历2到300之间的每个数 for num in range(2, 301): is_prime = True # 初始化当前数为素数 # 判断当前数是否为素数 for i in range(2, int(num**0.5)+1): if num % i == 0: is_prime = False break # 如果当前数是素数,则输出,并增加素数个数 if is_prime: print(num) count += 1 print("300以内的素数个数为:", count) ``` 运行以上程序,可以得到输出结果为: ``` 2 3 5 7 ... ``` 最终输出的素数个数为: 62 输出300以内的所有素数,并统计个数为62个。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值