C++埃拉托斯特筛子求质数算法

埃拉托斯特筛子求质数算法:

   a)创建一长度为N的数组,将所有元素置为1

   b)从数组下标2开始,每次找到一个值为1的元素时,在数组的剩余部分循环,并将下标1的元素置为0,即对于数组下标2,数组中所有2以上且是2的倍数的元素均被置为0(2,4,6,8,10等)对于下标3,数组中所有3以上,且是3的倍数的元素置为0(3,6,9,12等)

当该过程结束后,数组中还是1的元素,即素数。

设定1000各元素的数组,打印所有小于1000的素数

/*埃拉托斯特筛子求质数算法:

   a)创建一长度为N的数组,将所有元素置为1

   b)从数组下标2开始,每次找到一个值为1的元素时,在数组的剩余部分循环,并将下标1的元素置为0,
   即对于数组下标2,数组中所有2以上且是2的倍数的元素均被置为0(2,4,6,8,10等)
   对于下标3,数组中所有3以上,且是3的倍数的元素置为0(3,6,9,12等)

当该过程结束后,数组中还是1的元素,即素数。

设定1000各元素的数组,打印所有小于1000的素数*/
#include<iostream>
using namespace std;
int main()
{
	int a[1001];
	for(int i=0;i<1001;i++)
	{
		a[i]=1;
	}
	for(int i=2;i<1001;i++)
	{
		if(a[i]==1)
		{
			for(int j=i+i;j<1001;j+=i)
			{
				a[j]=0;//将相关倍数的元素置0(注意没有i本身) 
			}
		}
	}
	for(int i=2;i<1001;i++)
	{
		if(a[i]==1)
		{
			cout<<i<<" ";
		}
	}
	return 0;
}

### 计算素数的Java实现 在Java中,可以通过多种方式来计算素数。以下是基于提供的引用以及常见算法种高效实现方案。 #### 方法概述 为了判断个数是否为素数,可以采用以下逻辑: - 如果数字小于2,则它不是素数。 - 对于大于等于2的数字,检查是否存在从2到该数平方根范围内的因子。如果没有发现任何因子能够整除此数,则它是素数。 这种方法的时间复杂度接近O(√n),相较于逐检查所有较小数值更为优化[^2]。 #### 完整代码示例 下面是个完整的Java程序,用于找出指定范围内所有的素数: ```java public class PrimeNumbers { public static void main(String[] args) { int upperBound = 100; // 可调整上限值 System.out.println("素数列表:"); for (int i = 2; i <= upperBound; i++) { if (isPrime(i)) { // 调用辅助函数检测当前数字是否为素数 System.out.print(i + " "); } } } private static boolean isPrime(int num) { if (num < 2) return false; // 遍历至sqrt(num), 提升效率 for (int j = 2; j * j <= num; j++) { if (num % j == 0) return false; // 存在个因子可整除num, 则非素数 } return true; // 若无任何因子满足条件, 返回true表明其为素数 } } ``` 上述代码定义了个`main`方法用来设查找区间,并调用了名为`isPrime`的帮助函数逐个验证候选者是否符合条件。注意这里只迭代到了可能因子的最大界限即`sqrt(num)`处以减少不必要的运算次数^。 另外种思路则是利用埃拉托斯特尼筛法(Sieve of Eratosthenes),这是种更高效的批量筛选素数的技术,在处理较大规模数据集时表现尤佳[^3]。 #### 埃氏筛法版本 下面是另种基于埃拉托色尼斯筛选原理的解决方案: ```java import java.util.Arrays; public class SieveOfEratosthenes { public static void main(String[] args){ final int MAX=50;//设定最大边界 boolean [] primes=new boolean[MAX+1]; Arrays.fill(primes,true); primes[0]=primes[1]=false; for(int p=2;p*p<=MAX;p++){ if(primes[p]){ for(int multiple=p*p;multiple<=MAX;multiple+=p){ primes[multiple]=false; } } } System.out.println("Primes up to "+MAX+":"); for(int k=0;k<primes.length;k++) if(primes[k])System.out.print(k+" "); } } ``` 在此版实现里,我们先初始化个布尔型数组标记每位初始状态均为潜在素数(true),随后逐步淘汰掉各已知最小质因数倍率位上的成员直至整个序列扫描完毕为止[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值