列表

详情


NC226554. 求素数

描述

t次查询 输出n到m之间的素数个数。

输入描述

第一行一个整数t

以下t行每行两个整数 n m

输出描述

t行 每行一个整数 n到m之间的素数个数

示例1

输入:

5
1 100000000
114 514
123 456
13360 65617
10010 10086

输出:

5761455
67
57
4969
6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 1396ms, 内存消耗: 512968K, 提交时间: 2022-11-04 14:22:09

#include <iostream>
using namespace std;
const int N = 1e8+1;
bool sushu[N];
int sum[N],prime[6000000],cnt;
void getPrime() {
	for (int i = 2; i < N; ++i) {
		if (!sushu[i]) {
			prime[++cnt] = i;
		}
		sum[i] = cnt;
		for (int j = 1; prime[j] <= N / i; ++j) {
			sushu[prime[j] * i] = 1;
			if (!(i%prime[j]))break;
		}
	}
}
int main() {
	getPrime();
	int t; cin >> t;
	while (t--) {
		int n, m; cin >> n >> m;
		cout << sum[m] - sum[n - 1] << endl;
		
	}
}

C++ 解法, 执行用时: 1522ms, 内存消耗: 512992K, 提交时间: 2022-01-16 11:11:25

#include<bits/stdc++.h>
using namespace std;
int pr[5761459];
bool npr[100000005];
int q[100000005];
int t;
int n,m;
int sum;
int main(){
for(int i=2;i<=100000000;i++){
	q[i]=q[i-1];
	if(!npr[i]){
		pr[++sum]=i;
		q[i]++;
	}
	for(int j=1;j<=sum&&i*pr[j]<=100000000;j++){
		npr[i*pr[j]]=1;
		if(i%pr[j]==0)break;
	}
}

cin>>t;
while(t--){
	scanf("%d %d",&n,&m);
	printf("%d\n",q[m]-q[n-1]);
    }
	return 0;
}

上一题