总结--素数(1)

素数筛选与判断有多种方法

以下是筛选与判断的结合;

实现这种结合主要是解决筛选法空间的不足,筛选法需要大数组保存数字的判断结果,而将筛选法与判断结合将极大地加快判断素数,这样就可以很大程度地摆脱了数组空间不足的问题而实现对素数的判断

以下是实现代码:

#include<iostream>
#include<string>
#define max 1000000
using namespace std;
bool examine[max];
int  prime[max];
void set()
{
	int i,j,k;
	k=0;
	memset(examine,0,sizeof(examine));
	for(i=2;i<max;i++)
	{
		if(!examine[i])
			prime[k++]=i;                      //用prime数组储存素数
		for(j=0;j<k && prime[j]*i<max;j++) 
		{
			examine[prime[j]*i]=1;            //每个素数的i的倍数均为合数
			if(i % prime[j]==0)               
				break;
		}
	}
}
bool judge(long long n)
{
	for(int i=0;prime[i]*prime[i]<=n;i++)                 //这里不用sqrt函数主要是重复运算sqrt函数需要较长时间
	{
		if(n % prime[i]==0) return false;
	}
	return true;
}
int main()
{
	long long n;
	set();
	while(cin>>n)
	{
		if(judge(n))
			cout<<n<<" is a prime number"<<endl;
		else
			cout<<n<<" is not a prime number"<<endl;
	}
}


在Python中,可以通过多种方式生成1100之间的素数(质数)。以下是几种常见的实现方法,并对每种方法进行解释。 ### 方法一:嵌套循环检查每个数字是否为素数 这种方法通过遍历2到100之间的所有数字,并检查每个数字是否能被小于它的所有数字整除。 ```python num = [] for x in range(2, 101): for y in range(2, x): if x % y == 0: break else: num.append(x) print(num) ``` 此方法利用了`else`块与`for`循环结合的特性。只有当内层循环正常结束时(即没有找到因数),才会执行`else`块,从而将该数字视为素数并添加到列表中。 ### 方法二:优化后的循环使用范围减少计算次数 为了提高效率,可以将检查因数的范围缩小到`range(2, int(math.sqrt(x)) + 1)`,因为一个数如果存在因数,则必定有一个因数小于或等于其平方根。 ```python import math num = [] for x in range(2, 101): flag = True for y in range(2, int(math.sqrt(x)) + 1): if x % y == 0: flag = False break if flag: num.append(x) print(num) ``` 这种优化减少了不必要的重复计算,提高了程序的运行效率[^3]。 ### 方法三:使用while循环实现逻辑 另一种实现方式是使用`while`循环来判断每个数字是否为素数。 ```python for n in range(2, 101): i, a = 2, 1 while i < n: if n % i == 0: a = 0 break i += 1 if a == 1: print(n, end=' ') ``` 这种方法通过设置标志变量`a`来标记是否找到因数,最终根据标志变量决定是否输出该数字[^4]。 ### 方法四:使用单个循环和条件判断 还可以通过简单的单层循环和条件判断来实现。 ```python primes = [] for n in range(2, 101): is_prime = True for i in range(2, n): if n % i == 0: is_prime = False break if is_prime: primes.append(n) print(primes) ``` 这段代码通过定义一个布尔变量`is_prime`来判断当前数字是否为素数,最后将所有素数存储在一个列表中并输出[^1]。 ### 总结 以上方法都可以用于生成1100之间的素数。不同的方法在性能和可读性上有所差异,可以根据具体需求选择合适的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值