1500 Prime Gap

本文介绍了一种改进的线性筛法用于快速找出指定范围内的所有素数,并使用二分查找确定特定素数的位置。通过实例展示了算法的具体实现过程。

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

TAG 数论 素数

预处理把所有素数求出,用二分法求该数的下标。

0.05s 1916KB

不过时间、空间复杂度好像不如沿n向两端枚举。。(‖▔ ω▔),跟数据规模有关吧。。

这里用了改进的线性筛法,普通的筛法因为一个数有多个约数,会被重复刷掉很多次。

void makeprime() { total=-1; memset(isprime, true, sizeof(isprime) ); for (int i=2; i<=1299709; ++i) { if ( isprime[i] ) { num[ ++total ]=i; } for (int j=0; j<=total&& i*num[j]<=1299709; ++j) { isprime[i*num[j]]=false; if ( i%num[j]==0 ) { break; } } } }

程序:

/* source code of submission 428628, Zhongshan University Online Judge System */ #include <stdio.h> #include <memory.h> const int N=100000; int num[N]; bool isprime[1299709+2]; int total; int s,t,n; int bin_search(int s,int t,int x) { int mid; int ret; while ( s<=t ) { mid=(s+t)/2; if ( num[mid]==x ) { return mid; } else if ( num[mid]<x ) { s=mid+1; ret=mid; } else { t=mid-1; } } return ret; } void find_idx(int x, int &s, int &t) { s=bin_search(0,99999,x); if ( num[s]==x) { t=s; } else { t=s+1; } } void makeprime() { total=-1; memset(isprime, true, sizeof(isprime) ); for (int i=2; i<=1299709; ++i) { if ( isprime[i] ) { num[ ++total ]=i; } for (int j=0; j<=total&& i*num[j]<=1299709; ++j) { isprime[i*num[j]]=false; if ( i%num[j]==0 ) { break; } } } } int main(int argc, char *argv[]) { makeprime(); while ( scanf("%d", &n) && n!=0 ) { find_idx(n,s,t); printf("%d/n", num[t]-num[s]); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值