2017计算机学科夏令营上机考试 A:判决素数个数


A:判决素数个数  点击打开链接


总时间限制: 1000ms 内存限制: 65536kB
描述

输入两个整数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
#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了。
[cpp]  view plain  copy
  1. <strong>#include <iostream>  
  2. #include <math.h>  
  3. using namespace std;  
  4. bool IsPrime(int p){  
  5.     bool flag=true;  
  6.     if(p<2) return false;  
  7.     else if(p==2) flag=true;  
  8.     else{  
  9.         for(int i=2;i<=sqrt(p)+1;i++){  
  10.             flag=true;  
  11.             if(p%i==0) {  
  12.                 flag=false;  
  13.                 break;}  
  14.   
  15.         }  
  16.     }  
  17.     return flag;  
  18. }  
  19.   
  20. int main() {  
  21.     int x,y;int count=0;  
  22.     cin>>x>>y;  
  23.     int a=min(x,y);  
  24.     int b=max(x,y);  
  25.     for(int i=a;i<=b;i++){  
  26.         if(IsPrime(i)){  
  27.             count++;  
  28.         }  
  29.     }  
  30.     cout<<count<<endl;  
  31.     return 0;  
  32. }</strong>  
心得:
   素数的判断代码(模板)
[cpp]  view plain  copy
  1. bool IsPrime(int p){  
  2.     bool flag;  
  3.     if(p<2) return false;  
  4.     else if(p==2) flag=true;  
  5.     else{  
  6.         for(int i=2;i<=sqrt(p)+1;i++){  
  7.             flag=true;     
  8.             if(p%i==0) {  
  9.                 flag=false;  
  10.                 break;}  
  11.         }  
  12.     }  
  13.     return flag;  
  14. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值