算法提高 找素数
Description
给定区间[L, R] , 请计算区间中素数的个数。
Input
输入描述:
两个数L和R。
输入样例:
2 11
Output
输出描述:
一行,区间中素数的个数。
输出样例:
5
Sample Input 1
参考上文
Sample Output 1
参考上文
Hint
HINT:时间限制:1.0s 内存限制:256.0MB
2 <= L <= R <= 2147483647 R-L <= 1000000
Source
蓝桥杯练习系统 ID: 267 原题链接: http://lx.lanqiao.cn/problem.page?gpid=T267
这是代码,求改,一直不通过
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
ll L, R;
scanf("%lld%lld", &L, &R);
bool a[50001], ans[R-L+1];
memset(a,false,sizeof(a));
memset(ans,false,sizeof(ans));
ll cnt = 0, pri[50001];
for (int i = 2; i <= 50000; ++ i)
if (!a[i])
{
pri[++cnt] = i;
for (int j = i << 1; j <= 50000; j += i)
a[j] = 1;
}
for ( int i = 1; i <= cnt; i++)
{
for (ll j = max((ll)2,(L-1)/ pri[i]+1 )* pri[i]; j <= R; j += pri[i]) // 筛出 L~R 中的素数。
if(j - L >= 0) ans[j - L] = 1;
}
int tot = 0;
for(int i = 0 ; i <= R - L ; ++ i) if(!ans[i]) tot ++;
printf("%d\n" , tot);
return 0;
}