C言語注:(内部質量の広い範囲を解決するために、カウント数の)スクリーニング素数を求めます

オリジナルリンク: http://c.biancheng.net/c/

問題の説明:
整数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)。

おすすめ

転載: blog.csdn.net/weixin_42124234/article/details/102288780