筛选法求解素数问题C语言实现

本文介绍了使用筛选法解决素数问题的C语言实现。算法基于素数的性质,如合数一定有一个不超过其平方根的素因子,以及在筛选过程中可跳过已排除的倍数,从而提高效率。在第二轮筛选时,循环变量j的初始值设为i * i,增量为2 * i,保证了时间复杂度为O(n * sqrt(n))。

效率提升的算法基础为:
1.一个素数的任意整数倍必为非素数;
2.任何一个合数n一定有一个不超过sqrt(n)的素因子;
3.在第二轮非素数筛选时,因为是从所有奇数中按从小到大的顺序筛选素数的,由归纳法不难得知:
若i = 3为素数,则因为在第一轮筛序中已经将2的倍数的数排除了,故可直接从j = 3 * 3开始进行非素数的筛选;
若i = 5为素数,则因为在前边的筛选中已将2 * 5、3 * 5这两种情况排除,故可直接从j = 5 * 5开始进行非素数的筛选;
依次类推。。。
故第二轮的循环变量j的初始值可置为i * i;
因为若一个整数m为奇数,则m * m + m为一个偶数,而偶数在第一轮筛选中已经被排除。故增量可设为2 * i。
附注:
由筛选函数screen_prime_number()可知该函数的时间复杂度(不包括素数的打印)为O(n * sqrt(n))。

/*---------------------------------
功能:求解区间[1, n]之内的所有素数
输入示例:
100
输出示例:
2 3 5 7 11
13 17 19 23 29
31 37 41 43 47
53 59 61 67 71
73 79 83 89 97
Author: Zhang Kaizhou
Date: 2019-3-13 16:29:34
----------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAXSIZE 100000000 // 最大可求的(2, 100000000)之间的所有素数

int flag[MAXSIZE]; // 标记数组,用所存数据来标记与其下标对应的数字是否为素数
void screen_prime_number(int n);

int main(){
    int n;
    scanf("%d", &n);
    screen_prime_number(n
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值