使用筛选法求出 n 以内的素数

一、题目介绍

输入描述:

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

输出描述:

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

第二行,输出数组中2之后被清0 的个数。每行输出后换行

二、筛选法

筛选法求解过程为:将2~n之间的正整数放在数组内存储,将数组中2之后的所有能被2整除的数清0,再将3之后的所有能被3整除的数清0 ,以此类推,直到n为止。

数组中不为0 的数即为素数。

三、解析

首先,创造一个数组,在数组内放置1~n的整数。

其次,要利用筛选法的机制,2之后的所有能被2整除的数字清0,在这里需要使用for的双层嵌套,

表示,arr[1] 需要被arr[2] ~arr[n] 的数值全部模一遍,如若出现模等于0则设置这个模arr[1]的数值变为0。

四、代码演示

复制代码
#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;
}
相关推荐
Liangwei Lin1 分钟前
洛谷 P10471 最大异或对 The XOR Largest Pair
算法
一个平凡而乐于分享的小比特1 分钟前
C语言大小端格式详解
c语言·大小端格式
sin_hielo2 分钟前
leetcode 3652(定长滑动窗口/前缀和)
数据结构·算法·leetcode
AI科技星2 分钟前
质量定义方程中条数概念的解析与经典例子计算
数据结构·人工智能·经验分享·算法·计算机视觉
啊阿狸不会拉杆2 分钟前
《数字图像处理》第8章-图像压缩和水印
图像处理·人工智能·算法·计算机视觉·数字图像处理
智航GIS4 分钟前
ArcGIS大师之路500技---034重采样算法选择
人工智能·算法·arcgis
子夜江寒4 分钟前
决策树与回归树简介:原理、实现与应用
算法·决策树·回归
不爱吃糖的程序媛7 分钟前
OpenHarmony PC 第三方 C/C++ 库适配完整指南
c语言·c++·harmonyos
TL滕7 分钟前
从0开始学算法——第十九天(并查集)
笔记·学习·算法
Swift社区10 分钟前
LeetCode 451 - 根据字符出现频率排序
算法·leetcode·ssh