1. トピックの紹介
説明を入力してください:
複数の入力セットの場合、各行には正の整数 (100 以下) が入力されます。
出力の説明:
各行の整数 n の入力に対して、2 行を出力します。最初の行は、スペースで区切られた n (n を含む) 内の素数を出力します。2 行目は、配列内の 0 にクリアされた 2 の数を出力します
。出力の各行の後の改行
2. スクリーニング方法
スクリーニング法の解決プロセスは次のとおりです。 2 と n の間の正の整数を配列に格納し、配列内の 2 以降の 2 で割り切れるすべての数値をクリアし、次に 3 0 以降の 3 で割り切れるすべての数値をクリアします。 nまでオン。
配列内の 0 以外の数値は素数です。
3. 分析
まず、配列を作成し、1 から n までの整数を配列に配置します。
次に、スクリーニング メソッドのメカニズムを使用して、2 以降の 2 で割り切れるすべての数値をクリアします。ここでは、for の二重ネストを使用する必要があります。
これは、arr[1] を arr[2] ~arr[n] のすべての値でモジュロする必要があることを意味します。モジュラスが 0 に等しい場合は、このモジュロ arr[1] の値を 0 に設定します。
4. コードのデモ
#include <stdio.h>
int main()
{
int n =0;
int count =0;
int arr[1000];
while(scanf("%d",&n)!=EOF)//多组输入
{
for(int i =0;i<n;i++)
{
arr[i]=i+1;//arr[0]内存储数字1
}
arr[0]=0;//把你的1拿出来不然会出错!因为任何数除去1都是整除的
for(int i =1;i<n;i++)
{
if(arr[i]==0)
{
continue;
}
for(int j =i+1;j<n;j++)
//数组中2之后的所有能被2整除的数清0,再把3之后的所有能被3整除的数字清0
{
if(arr[j]!=0)
{
if(arr[j]%arr[i]==0)
{
arr[j]=0;
count++;
}
}
}
}
for(int i=0;i<n;i++)
{
if(arr[i]!=0)
{
printf("%d ",arr[i]);
}
}
printf("\n");
printf("%d",count);
}
return 0;
}