首页 > 试题广场 >

筛选法求素数

[编程题]筛选法求素数
  • 热度指数:108 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
用筛选法求n以内的素数。筛选法求解过程为:将2~n之间的正整数放在数组内存储,将数组中2之后的所有能被2整除的数清0,再将3之后的所有能被3整除的数清0 ,以此类推,直到n为止。数组中不为0 的数即为素数。

输入描述:
多组输入,每行输入一个正整数(不大于100)。


输出描述:
针对每行输入的整数n,输出两行,第一行,输出n之内(包括n)的素数,用空格分隔,

第二行,输出数组中2之后0 的个数。每行输出后换行。
示例1

输入

20

输出

2 3 5 7 11 13 17 19
11
#include<stdio.h>

int main()
{
    int n=0;
    while(~scanf("%d",&n))
    {
        //int arr[n+1]; //变长数组
        int arr[101];
        int i=0;
        //存储数据
        for(i=2;i<=n;i++) //把2-n的数字存起来
        {
            arr[i]=i;
        }
        //列举所有的除数
        int j=0;
        for(j=2;j<=n;j++)
        {
            int k=0;
            for(k=j+1;k<=n;k++)
            {
                if(arr[k]%j==0)
                {
                    arr[k]=0; 
                }
            }
        }
        //输出并记录
        int count=0;
        for(i=2;i<=n;i++)
        {
            if(arr[i]!=0)
                printf("%d ",arr[i]);
            else
                count++;
        }
        printf("\n%d\n",count);
    }
    return 0;
}
发表于 2022-09-04 16:55:14 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        vector<int> a;
        for(int i=0;i<=n;i++)
        	a.push_back(0);
        for(int i=2;i<=n;i++)
        {
            if(a[i]==0)
            {
                for(int j=i*i;j<=n;j=j+i)
                {
                    a[j]=1;
                }
            }
            
        }
        int sum=-1;
        for(int i=2;i<=n;i++)
        {
            if(a[i]==0)
            {
                cout<<i<<" ";
				sum++;            	
			}
        }
        int result=n-2-sum;
        cout<<endl;
        
        cout<<result<<endl;
    }
    return 0;
}

发表于 2019-09-14 17:37:49 回复(0)
n = int(input())
ss = list(range(2,n+1))
i = 2
while i<n:
  res = []
  for j in range(len(ss)):
    if ss[j]<=i or (ss[j]>i and  ss[j]%i != 0):
      res.append(ss[j])
  i += 1
  ss = tuple(res)
res1 = ""
for number in ss:
  res1 += str(number)+" "
print(res1.strip())
print(n-1 - len(ss))
减少重复判断
发表于 2019-09-12 17:56:23 回复(0)
var line = readline();
while(line){
    let numObj = new Array(parseInt(line)-1);
    let numList = numObj.fill(0).map((item, index) => index+2);
    let index = 0;
    while(index < numList.length){
        let value = numList[index];
        for(let i=index+1; i<numList.length; i++){
            if(numList[i]%value===0){
                numList.splice(i, 1);
                i -= 1;
            }
        }
        index ++;
    }
    print(numList.join(' '));
    print(parseInt(line)-1-numList.length);
    line = readline();
}

发表于 2019-09-11 00:20:16 回复(0)