A:判决素数个数 点击打开链接
-
描述
-
输入两个整数X和Y,输出两者之间的素数个数(包括X和Y)。
输入
- 两个整数X和Y(1 <= X,Y <= 10 5)。 输出
- 输出一个整数,表示X,Y之间的素数个数(包括X和Y)。 样例输入
-
1 100
样例输出
-
25
思路分析
方法1:直接用普通素数筛选模板,筛选出[1,x-1] 内的素数个数ans1,再筛选出[1,y] 的宿舍个数ans2,最后求abs(ans1-ans2)
方法2:使用判决一个数是否是素数的模板,从[x,y]内针对每个数都调用一次IsPrime(),使用cnt记录。注意:x必须为输入两值的min,y必须为输入两值的max.
由于X和Y的范围为1e5,因此要考虑long long,因为int的最大值65535<100000
AC代码:
方法1:new AC Code
方法2:这是我第一遍刷本题时,写的代码。当时没有考虑到long long ,竟然也AC了。
#include <iostream>
#include<cstring>
using namespace std;
const long long nmax=1e5;
long long mark[nmax];
long long prime[nmax];
long long Prime(long long n){//求从1开始到n的素数个数,,[1,n]
memset(mark,0,sizeof(mark));
long long index=0;
for(long long i=2;i<=n;i++){
if(mark[i]!=1){
prime[index++]=i;
for(long long j=2*i;j<=n;j+=i) {
mark[j]=1;
}
}
}
return index;
}
int main(int argc, char** argv) {
long long x,y;
while(scanf("%lld%lld",&x,&y)==2){
long long ans1=Prime(x-1);//[1,x-1]
long long ans2=Prime(y);//[1,y]
printf("%lld",abs(ans1-ans2));//[x,y] 注意取绝对值
}
return 0;
}
方法2:这是我第一遍刷本题时,写的代码。当时没有考虑到long long ,竟然也AC了。
- <strong>#include <iostream>
- #include <math.h>
- using namespace std;
- bool IsPrime(int p){
- bool flag=true;
- if(p<2) return false;
- else if(p==2) flag=true;
- else{
- for(int i=2;i<=sqrt(p)+1;i++){
- flag=true;
- if(p%i==0) {
- flag=false;
- break;}
- }
- }
- return flag;
- }
- int main() {
- int x,y;int count=0;
- cin>>x>>y;
- int a=min(x,y);
- int b=max(x,y);
- for(int i=a;i<=b;i++){
- if(IsPrime(i)){
- count++;
- }
- }
- cout<<count<<endl;
- return 0;
- }</strong>
素数的判断代码(模板)
- bool IsPrime(int p){
- bool flag;
- if(p<2) return false;
- else if(p==2) flag=true;
- else{
- for(int i=2;i<=sqrt(p)+1;i++){
- flag=true;
- if(p%i==0) {
- flag=false;
- break;}
- }
- }
- return flag;
- }