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

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;
}

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

堅持,而不是打雞血~


發佈了48 篇原創文章 · 獲贊 16 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章