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

一、题目介绍

输入描述:

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

输出描述:

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

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

二、筛选法

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

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

三、解析

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

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

表示,arr1 需要被arr2 ~arrn 的数值全部模一遍,如若出现模等于0则设置这个模arr1的数值变为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;
}
相关推荐
伊玛目的门徒3 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
Jerry3 小时前
LeetCode 226. 翻转二叉树
算法
想做小南娘,发现自己是女生喵4 小时前
【无标题】
数据结构·算法
Kx_Triumphs6 小时前
HDU4348 To the moon(主席树区间修改模板)
算法·题解
旖-旎6 小时前
《LeetCode647 回文子串 || LeetCode 5 最长回文子串》
c++·算法·leetcode·动态规划·哈希算法
轻颂呀7 小时前
约瑟夫环问题
算法
凤凰院凶涛QAQ9 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
科技大视界9 小时前
投资AI项目,传统尽调不够用了——李章虎律师拆解算法、数据、算力三大雷区
人工智能·算法·数据挖掘
郝学胜-神的一滴9 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法