列表

详情


BC127. 筛选法求素数

描述

用筛选法求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

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 316KB, 提交时间: 2021-10-23

#include <stdio.h>
int main()
{
    int i,j,n,a[100];
    int sum=0;                                //最后数组中0的个数
    while(scanf("%d",&n)!=EOF){
        for(i=2;i<=n;i++){                    //将值导入数组(2--n)
            a[i-2]=i;                         //a0--a[n-2]
        }
        for(j=2;j<=n;j++){                    /*     从a[1]到a[n-2]判断数值是否能整除2,
                                              每循环一次初始循环的数组下标+1,整除数+1*/
            for(i=j-1;i<n-1;i++){
                if(a[i]%j==0) a[i]=0;
            }
        }
        for(i=0;i<n-1;i++){                   //输出不为0的数据并计算等于0的个数
            if(a[i]!=0) printf("%d ",a[i]);
            else sum++;
        }printf("\n%d",sum);                  //换行输出等于0的个数
    }
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 356KB, 提交时间: 2021-06-26

#include <stdio.h>



int main()
{
    int a=0;
    int count = 0;
    while(~scanf("%d",&a))
    {
        int i=0;
        int j=0;
        for(i=2;i<=a;i++)
        {
            for(j=2;j<=sqrt(i);j+=1)
            {
                if(i%j == 0)
                {
                    break;
                }
            }
            if(j>sqrt(i))
            {
                printf("%d ",i);
                count++;
            }
        }
    }
    printf("\n");
    printf("%d",a-count-1);
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 360KB, 提交时间: 2021-09-10

#include <stdio.h>
int main()
{
    int i,j,n,a[100];
    int sum=0;
    while(scanf("%d",&n)!=EOF){
        for(i=2;i<=n;i++){
            a[i-2]=i;
        }
        for(j=2;j<=n;j++){
            for(i=j-1;i<n-1;i++){
                if(a[i]%j==0) a[i]=0;
            }
        }
        for(i=0;i<n-1;i++){
            if(a[i]!=0) printf("%d ",a[i]);
            else sum++;
        }printf("\n%d",sum);
    }
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 368KB, 提交时间: 2021-02-21

#include <stdio.h>
int main()
{
    int n, i, j, count;
    scanf("%d",&n);
    for(i=2;i<=n; i++)
    {
        for(j=2; j<=i; j++)
        {
            if(i%j==0)
                break;
        }
        if(i==j)
        {
            printf("%d ", i);
            count++;
        }
    }
    printf("\n");
    printf("%d ", n-count-1);
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2021-07-16

#include<stdio.h>
int main()
{
    int n,a[100],i,j,num=0;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=2;i<=n;i++)
        {
            a[i]=i;
        }
        for(i=2;i<=n;i++)
        {
            for(j=i+1;j<=n;j++)
            {
                if(a[j]%i==0)
                a[j]=0;
            }
        }
    }
        for(i=2;i<=n;i++)
        {
            if(a[i]!=0)
            printf("%d ",a[i]);
        if(a[i]==0)
            num++;
        }
    printf("\n");
        printf("%d\n",num);
        
    }

上一题