問題の説明:
整数n(<= 100)を入力し、必要と1の間のすべての素数〜n及び各列5のための出力、および出力
分析:
従来の方法によれば、必要な範囲内の素数の数は外側のループ(ループ制御変数i)を作ることである、私はこの範囲のすべての数値をとっ;内側のループを実行し(ループ制御変数j )、今度は私%の多数の決定[I-1 2、 ] nは0であり、Iこの間隔の[2、I-1]には、他の実行の数を有する場合、この数は素数私はありません。1〜N(ユーザー入力)のための内部ループ数決意一回行われ、nが大きい場合、内側および外側の入れ子になったループ動作の数は、より非効率的であろう。
このような状況を踏まえ、サイクルタイムを大幅に削減、重複や不必要なサイクルを避けるために、アプリケーションの方法がスクリーニングされています。コードで直接見て:
#include <stdio.h>
#include <string.h>
#define N 100
int main(void)
{
int prime[N+1];//prime[i]的值为0表示i在筛子上,值为1表示不在筛子上
int n;//输入30,求1~n之间的质数(可随意)
scanf("%d",&n);
memset(prime,0,sizeof(prime));//将prime中所有的元素值清0
prime[1]=1;//默认1不是质数
for(int i=2;i*i<=n;i++)
{
if(prime[i]==0)
{
for(int j=2*i;j<=n;j+=i)//筛去i的2倍(i*2,该语句仅执行一次),3倍(j+=i),4倍(j+=i)…,这些数肯定不是质数(因为i除了被1和自身整除外,还能被它自身倍数整除)。
{
prime[j]=1;
}
}
}
int t = 0 ; //统计质数个数,以控制每行输出5个
for(int i = 1; i <= n; i++)
{
if(prime[i] == 0) //i是质数,则输出,计数,一行输出5个
{
printf("%-2d ", i);
t++;
if(t%5 == 0) printf("\n"); //一行已输出5个
}
}
return 0;
}
出力:
プロセス上記のコードは2〜30の間のアナログ素数を必要とします。
-
I = 2の場合:プライム[2] = 0(すなわち、2は素数である、配列の添字、すなわち我々が動作しなければならない番号に対応)、プライム[4]、プライム[6]、プライム[8] ...プライム[30]に設定されています1。(すなわち、2〜30の範囲で、数2の倍数に対応する素数ではありません)
-
場合I = 3:プライム[3] = 0、プライム[6]、プライム[9]、...プライム[27]、プライム[30]が1に設定されているので
-
場合I = 4:プライムので[4] = 1、ステップスクリーニングを続行していません。図4は、2の乗算係数として除外されているため、図4は、素数でないため
-
I = 5の場合:プライム[5] = 0であるので、プライム[10]、プライム[15]、プライム[20]、プライム[25]、プライム[30]は1に設定されています。
-
I = 6:6> SQRT(30)、アルゴリズムは終了する(すなわち、6 * 6> 30)。