【C实现】P5736 【深基7.例2】质数筛

这是一个C++程序,用于读取整数n,然后遍历输入的n个整数,通过Isprime函数判断每个数是否为素数。如果为素数,则将其打印出来。Isprime函数通过检查2到根号a之间的数是否能整除a来确定a的素数状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
int Isprime(int a){
    if(a<2) return 0;
    else{
        for(int i=2;i*i<=a;i++){
            if(a%i==0) return 0;
        }
    }
    return 1;
}
int main(){
    int n,a;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a);
        if(Isprime(a)) printf("%d ",a);
    }
    return 0;
}

 

### 使用C语言在PTA平台上实现埃拉托斯特尼筛法求区间素数 埃拉托斯特尼筛法是一种高效的算法用于找出一定范围内的所有素数。对于给定的一个正整数n,该方法可以有效地找到小于等于n的所有素数[^1]。 为了实现在特定区间[m, n]内寻找素数的功能,在实际编程过程中通常会先创建一个布尔类型的数组`isPrime[]`来标记哪些数字是素数。初始情况下假设所有的数值都是素数(即设置为true),之后通过遍历并更新这个数组中的元素状态完成筛选过程。当处理较大区间的查询时,考虑到内存使用的效率问题,建议只开辟大小约为sqrt(n)+1的空间存储必要的标志位即可满足需求[^2]。 下面是一个具体的子展示如何利用C语言编写程序以获取指定范围内所有质数: ```c #include <stdio.h> #include <string.h> #define MAXN 1000005 // 定义最大可能值加一作为上限 int prime[MAXN]; // 存储素数表 bool is_prime[MAXN]; // 判断是否为素数的辅助数组 void sieve(int max_val) { memset(is_prime, true, sizeof(bool)*(max_val+1)); int cnt = 0; for (long long i = 2; i <= max_val; ++i){ if (is_prime[i]){ prime[cnt++] = i; for (long long j=i*i;j<=max_val;j+=i) is_prime[j]=false; } } } // 找到m-n之间的所有素数 void find_primes_between_m_and_n(long m,long n){ bool mark[n-m+1]; memset(mark,true,sizeof(bool)*(n-m+1)); for (int p=0;p<MAXN && prime[p]*prime[p]<=n;++p){ long first_multiple=(m/prime[p])*prime[p]; if(first_multiple<m)first_multiple+=prime[p]; for(;first_multiple<=n;first_multiple+=prime[p]) mark[first_multiple-m]=false; if(first_modified==m)mark[0]=true; } printf("Primes between %ld and %ld:\n", m,n); for (long i=m;i<=n;++i) if (mark[i-m])printf("%ld ",i); } ``` 上述代码片段展示了完整的埃氏筛法逻辑以及针对任意两个边界值之间查找素数的具体操作。需要注意的是这里定义了一个较大的常量`MAXN`用来表示预估的最大输入规模,并据此分配相应的空间;而在具体应用中应当依据实际情况调整此参数取值[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值