A:判決素數個數
- 總時間限制:
- 1000ms
- 內存限制:
- 65536kB
- 描述
-
輸入兩個整數X和Y,輸出兩者之間的素數個數(包括X和Y)。
- 輸入
- 兩個整數X和Y(1 <= X,Y <= 105)。
- 輸出
- 輸出一個整數,表示X,Y之間的素數個數(包括X和Y)。
- 樣例輸入
-
1 100
- 樣例輸出
25
**********************************
這道題可真是把我坑慘了。本來以爲這是機試中最水的一道題,結果竟然花費了我一個小時多還沒有AC,WA了11次。。。期間考慮了各種因素,多想了許多。。。要好好總結一下。
首先,我沒有考慮輸入的x,y的大小關係,便直接來了一份這樣的代碼:
#include <cstdio>
using namespace std;
bool mark[100001]={0};
int prime[10001];
int size=0;
void init()
{
for(int i=2;i<=100000;i++){
if(!mark[i]){
prime[size++]=i;
for(int j=i;j<=100000;j+=i){
mark[j]=true;
}
}
}
}
int main()
{
int x,y,cnt=0;
int i;
scanf("%d%d",&x,&y);
init();
if(x>prime[size-1]||y<2){
printf("0\n");
return 0;
}
for(i=0;i<size;i++){
if(prime[i]>=x&&prime[i]<=y)
cnt++;
}
printf("%d\n",cnt);
return 0;
}
人家並沒說x,y誰大誰小,所以必須先分出來才能再按我那麼寫。而且,我這題是直接按素數篩法寫的,因爲我看最大數是十萬,怕挨個找會超時,但是下面這份仁兄的AC代碼卻不超時,看來在這個數量級上還是可以的。
#include <cstdio>
#include <cstring>
#include <cmath>
bool isPrime(int x){
if(x == 1)return false;
if(x % 2 == 0 && x != 2)return false;
else{
for(int i = 3;i < sqrt(x)+1;i += 2){
if(x % i == 0)return false;
}
return true;
}
}
int main(){
int x,y;
scanf("%d%d",&x,&y);
int sum = 0;
if(x > y){
int t;
t = x;
x = y;
y = t;
}
for(int i = x;i <= y;i++){
if(isPrime(i) == true)sum++;
}
printf("%d\n",sum);
return 0;
}
接下來我分別懷疑過一組/多組測試數據問題、printf直接輸出0格式問題,但都不是。。。最後放棄了,直到今天,南財的一位朋友告訴我:當x,y相等且均爲素數時,應輸出1,而我是輸出2的。。天哪,這就是理解錯誤了,他明明不是說包括x和y嗎!我把這個地方一改,就AC了,十分難受。唉,還是得多積累啊,新手上路,仍需努力!
#include <cstdio>
using namespace std;
bool mark[100001]={0};
int prime[100001];
int size=0;
void init()
{
for(int i=2;i<=100000;i++){
if(!mark[i]){
prime[size++]=i;
for(int j=i;j<=100000;j+=i){
mark[j]=true;
}
}
}
}
bool isprime(int n)
{
for(int i=0;i<size;i++){
if(prime[i]==n)
return true;
}
return false;
}
int main()
{
int x,y,cnt=0;
int i;
scanf("%d%d",&x,&y);
init();
int mx=x>y?x:y;
int mn=x<y?x:y;
if(mn>prime[size-1]||mx<2){
printf("%d\n",0);
return 0;
}
for(i=0;i<size;i++){
if(prime[i]>mn&&prime[i]<mx)
cnt++;
}
cnt=cnt+isprime(mx)+isprime(mn);
if(mx==mn&&isprime(mx))
printf("%d\n",cnt-1);
else
printf("%d\n",cnt);
return 0;
}
*************************************
堅持,而不是打雞血~