プライムシーブ(python、C)

一般ふるい

たとえば、N(Nを含まない)内のすべての素数を要求するには、添え字をN-1のリストpに初期化し、要素に値1を割り当てます。添え字は数値を表し、値1/0ははい/いいえの素数を表します。2から始まり、リスト内のその倍数は素数ではないため、0が割り当てられ、操作に参加しなくなります。次に、3、5(4、6は2によって削除されます)、7 ...などです。

python:

#通过构造素数表,找到小于n的所有素数
n=100
p=[1]*n#下标代表数字(0,1是合数不用管),值1/0代表是否为素数
for i in range(2,n):
    if p[i]==1:
        print("%d\t"%i,end='')
        k=i  #注意这里
        while i*k<n:
            p[i*k]=0
            k+=1

C:

#include<stdio.h>
#define N 500000

int main()
{
    
    
	int p[N]={
    
    1,1},k;
	//利用c的列表中未初始化元素用0补全,省掉了赋值步骤.现在p中1代表合数,0代表质数 
	for(int i=2;i<N;i++)
	{
    
    
		if(p[i]==0)
		{
    
    
			printf("%d\n",i);
			for(unsigned long k=i;i*k<N;k++)//注意这里
				p[i*k]=1;
		}
	}
	
	return 0; 
}

注意すべき場所は少し改善されています。kを2ではなくiから始めて、素数の前に削除された数が繰り返しカウントされないようにします(たとえば、2 * 5は10を除外し、5をカウントする必要はありません) * 2)。

迅速なスクリーニング

上記の一般的なふるい法を使用しても計算は繰り返されます。たとえば、30は2、3、および5サイクル(2 * 15、3 * 10、5 * 6)で計算されますが、高速ふるい法にはこの欠点はありません。これは、重複がない場合の除外ステップです⬇
ここに画像の説明を挿入

最も便利なのは、テーブルにヒットすることです((

もう終わりです。

#include <stdio.h>

int main()
{
    
    
	int x,i;
	scanf("%d",&x);
	int a[]={
    
    素数粘这里}; 
	while(a[i]<x)
    {
    
    
    	printf("%d\t",a[i]);
    	i++;
	}
    
    return 0;
} 

おすすめ

転載: blog.csdn.net/qq_45268474/article/details/108402270