素数を求めて - プライムのスクリーニング方法であっ

実際には、プライムふるいは相対的に非常に簡単な方法と考えることができますが、私は常に自分自身の理解と書いたコードの一部とされ、そしてシステムについて学ぶことにしました。
一般的に、我々は、数が素数であるかどうかを決定し、この数は、一般的に1以外見られ、それ自体が要因があるかどうか、次のように、コアコードは

int n,i;
scanf("%d",&n);
for(i=2;i<n;i++){
	if(n%i==0)break;
}
if(i>=n)printf("ture");

非素数A = I * jの場合はもちろん、決意するこの方法は、かなり多くの、完全に2からN-1に、実際には、決定されず、I <= jを、多数あるため、その要因がある場合が明らかですそれはまた、小さな要因をしなければならず、小さな因子I <= SQRT();そう限り、2からライン上のSQRT()に列挙。コードは以下の通りであります:

int n,i,x;
scanf("%d",&n);
x=(int)sqrt(n);
for(i=2;i<=x;i++){
	if(n%i==0)break;
}
if(i>=n)printf("ture");

あなたはより多くの素数を判断する場合には実際には、あなたが実際にはライン上のテーブルを打ちます。プレイテーブルである何、あなた最初のプレイはあなたが、それはそれで素数でないテーブルをチェックインするたび後、首相のテーブルです。その後、初めに、あなたはシリング、すべての数字が素数であり、テーブルから素数の非素数を取り除く::テーブルのアプローチを演奏すると、この方法ですが、以下のコードを参照してください

#include<cstdio>
#include<cstring>
bool Pri[100010];       //一般这么大够了,代表从1筛到100000
void prime(){
	memset(Pri,0,sizeof(Pri));
	int i,j;
	Pri[1]=1;           //1不是素数 
	for(i=2;i*i<=100000;i++){        //2到100000的非素数必然含有2到sqrt(i)的因子 
		if(Pri[i]==0){
			for(j=i*i;j<=100000;j+=i){    //因为如果j=i*p,p<i开始,实际上以p为因子的非素数已经被筛了一次 ,不用再筛了 
				Pri[j]=1;
			}
		}
	}
}
int main()
{
	prime();
	int n;
	while((scanf("%d",&n))>=1){          //不同题目要求结束方式不一样 
		if(Pri[n]==0)printf("ture\n");
		else printf("false\n");
	}
	return 0;
} 

当然、理解本质是最重要的、下面有一道题:
彼の農場の組織を改善するために、農夫ジョンが範囲1内の別個のシリアル番号と自分のN(1 <= N <= 5,000)牛の各ラベル...2万。残念ながら、彼は牛が他のものより優れていくつかのシリアル番号を解釈することを認識しません。具体的には、そのシリアル番号最高の素因数を持っている牛は、他のすべての牛の中で最も高い社会的地位を楽しんでいます。

(リコール素数1自体を除いて全く除数を有していないだけの数となる。番号6は、2、3で割り切れるされ、ないしながら数7が素数です)。

N(1 <= N <= 5,000)の範囲1にシリアル番号... 20,000セットが与えられると、最大の素因数を有するものを決定します。
入力

  • 1行目:単一の整数、N

  • ライン2 ... N + 1:試験対象のシリアル番号、ラインごとに
    出力

  • 1はライン:.入力ファイルを表示されていることで最も早い。最後より一つ、一つの出力内にある場合は素因数を持つ整数の最大の
    サンプルを入力
    。4
    36
    38は
    40
    42は、
    出力サンプル
    38がある
    スポンサー
    の数を求めて、いくつかのトップ手段の対象素因数の最大数は、実際には、それを行う方法を、行うためのテーブルを再生するために使用することができます:
    まず、元のテーブルの平均:素数が0である、非素数は1です。
    今、素数自体、非素数が最大の素数の要因です。
    だから、素数を見つける2から、それは彼の倍数を探してアップしている、とあなたが直接割り当てることができるように、私たちはそうトラバース、プライムバックは、前の素数よりも大きくなければなりませんので、彼の倍数の素因数は、この素数にリセットされます。もう一つのポイントは、この表には、自分のために設定され素数を忘れてはならない、と内部ループがあるため、この背後にある品質のより大きな数の、私は*、と私は開始したいから起動することはできません。
    コードは以下の通りであります:

#include<cstdio>
#include<cstring> 
int maxpri[20010];
void maxp()
{
	int i,j;
	memset(maxpri,0,sizeof(maxpri));
	maxpri[1]=1;
	for(i=2;i<=20005;i++){
		if(maxpri[i]==0){
			for(j=i;j<=20005;j+=i){
				maxpri[j]=i;            //不断替换,由素数找倍数,后面素数大于前面的 
			}
		}
	}
}
int main()
{
	maxp();
	int n,i,p,tprim;
	while((scanf("%d",&n))>0){            //输入n,代表接下来输入n个数 
	int max=0,how=0;
	for(i=0;i<n;i++){
		scanf("%d",&p);        //输入这n个数 
		tprim=maxpri[p];       //取最大素数 
		if(tprim>max){
			max=tprim;         //保存最大素数 
			how=p;             //保存含最大素因子的数 
		}
	}
	printf("%d\n",how);
}
	return 0;
}
公開された14元の記事 ウォン称賛16 ビュー1285

おすすめ

転載: blog.csdn.net/weixin_45981189/article/details/104978324