天天看點

2017北大信科夏令營機試A:判決素數個數

A:判決素數個數

  • 檢視
  • 送出
  • 統計
  • 提示
  • 提問
總時間限制: 
1000ms 
記憶體限制: 
65536kB
描述
輸入兩個整數X和Y,輸出兩者之間的素數個數(包括X和Y)。
輸入
兩個整數X和Y(1 <= X,Y <= 10 5)。
輸出
輸出一個整數,表示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了,十分難受
2017北大信科夏令營機試A:判決素數個數
。唉,還是得多積累啊,新手上路, 仍需努力!
#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;
}
           

*************************************

堅持,而不是打雞血~

繼續閱讀