一、题目
输入多组数据,查找范围内的质数
二、思路
1、找到一个最大的右范围
2、设置一个dp[maxnum+1],1表示是质数,0表示非质数;初始化都为1
3、当一个数是1,即为质数,那么从ii开始,每加一个i都是非质数,置为0
for(int j=ii;j<=right;j+=i){
dp[j]=0;
}
4、统计dp数组,动态规划ans[i]
三、代码
#include <iostream>
#include <string.h>
#include <string>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <unordered_map>
#include <list>
#include <memory>
#include <functional>
#include <set>
#include <iostream>
#include <vector>
#include <algorithm>
#include <limits.h>
#include <thread>
//#include <Windows.h>
#include <mutex>
#include <condition_variable>
using namespace std;
class Solution{
public:
/*
int Solve(int &left,int &right){
vector<int>dp(right+1,1);
int sum=0;
for(int i=2;i<=right;++i){
if(dp[i]==1){
if(i>=left){
sum++;
}
if((long long)i*i<=right){
for(int j=i*i;j<=right;j+=i){
dp[j]=0;
}
}
}
}
return sum;
}
*/
void SolveMax(int &left,int &right,vector<int>&dp){
//vector<int>dp(right+1,1);
//int sum=0;
for(int i=2;i<=right;++i){
if(dp[i]==1){
if((long long)i*i<=right){
for(int j=i*i;j<=right;j+=i){
dp[j]=0;
}
}
}
}
}
/*
int OutPut(int &left,int &right,vector<int>&dp){
int sum=0;
left=max(left,2);
for(int i=left;i<=right;++i){
if(dp[i]==1){
sum++;
}
}
return sum;
}
*/
void SumNum(vector<int>&ans,vector<int>&dp){
int size=dp.size();
dp[1]=0;
dp[0]=0;
for(int i=2;i<size;++i){
if(dp[i]==1){
ans[i]=ans[i-1]+1;
}
else{
ans[i]=ans[i-1];
}
}
}
};
int main(){
int M;
int MaxL=0,MaxR=0;
vector<pair<int,int>>res;
Solution so;
while(cin>>M){
int L,R;
for(int i=0;i<M;++i){
cin>>L>>R;
res.emplace_back(make_pair(L,R));
if(R>MaxR){
MaxR=R;
MaxL=L;
}
}
}
vector<int>dp(MaxR+1,1);
so.SolveMax(MaxL,MaxR,dp);
vector<int>ans(MaxR+1,0);
int size=res.size();
so.SumNum(ans,dp);
for(int i=0;i<size;++i){
cout<<ans[res[i].second]-ans[res[i].first-1]<<endl;
}
/*
for(int i=0;i<size;++i){
cout<<so.OutPut(res[i].first,res[i].second,dp)<<endl;
}
*/
return 0;
}