计算机上级复试资料

素数的判断

2019-05-02  本文已影响0人  zju_dream

5.4.1 素数的判断

bool isPrim(int num) {
    if(num < 1) {
        return false;
    }
    // n没有接近上界的时候才可以这样写,否则很容易越界。后者吧i的类型改为long long
    for(int i = 2; i*i < num; i++) {
        if(num % i == 0) return false;
    }
    return true;
}

5.4.2 素数表的获取

const int MAX_LEN = 101;
int primes[MAX_LEN] = {0};
bool p[MAX_LEN] = {0}; // p[i] == true表示它是素数
int nPrimes = 0;
void findPrimes() {
    for(int i = 1; i < MAX_LEN; i++) {
        if(isPrim(i)) {
            p[i] = true;
            primes[nPrims++] = i;
        }
    }
}
#include <iostream>
using namespace std;

const int MAX_LEN = 101;
int primes[MAX_LEN], nPrimes= 0;
bool p[MAX_LEN] = {0};

void find_primes() {
    for(int i = 2; i < MAX_LEN; i++) {
        if(!p[i]) {
            primes[nPrimes++] = i;
            for(int j = i*2; j < MAX_LEN; j += i) {
                p[j] = true;
            }
        }
    }
}

int main() {
    find_primes();
}

习题

#include <cstdio>
const int maxn=10001;
int prime[maxn],num=0;
bool p[maxn]={0};
void Find_Prime()
{
    for(int i=2;i<maxn;i++)
    {
        if(p[i]==false)
        {
            prime[num++]=i;
            for(int j=i+i;j<maxn;j+=i)
                p[j]=true;
        }
    }
}
int main()
{
    int n;
    Find_Prime();
    while(~scanf("%d",&n))
    {
        int count=0;
        for(int i=0;i<maxn;i++)
        {
            if(prime[i]<n&&prime[i]%10==1)
            {
                count++;
                printf("%d",prime[i]);
                if(i!=num-1){
                    printf("(%d, %d)", i, num-1);
                    printf("*");
                }
            }
            else if(prime[i]>=n)
                break;
        }
        if(count==0)    printf("-1");
        printf("\n");
    }
    return 0;
}
#include <iostream>
using namespace std;

const int MAX_LEN = 200001;
int primes[MAX_LEN], nPrimes= 0;
bool p[MAX_LEN] = {0};

void find_primes() {
    nPrimes = 0;
    for(int i = 2; i < MAX_LEN; i++) {
        //if(i > n) break;
        if(!p[i]) {
            primes[nPrimes++] = i;
            for(int j = i*2; j < MAX_LEN; j += i) {
                p[j] = true;
            }
            
        }
    }
}

int main() {
    int n;
    find_primes();
    while(scanf("%d", &n) != EOF) {
        printf("%d\n", primes[n-1]);
    }
    
    return 0;
}


#include <iostream>
using namespace std;

const int MAX_LEN = 40000; // 2^15是32768
int primes[MAX_LEN];
int cnt = 0;
bool p[MAX_LEN] = {0};

void find_primes() {
    for(int i = 2; i < MAX_LEN; i++) {
        // 如果没有被筛掉
        if(!p[i]) {
            primes[cnt++] = i;
            for(int j = i*2; j < MAX_LEN; j += i) {
                p[j] = true;
            }
        }
    }
}

int main()
{
    int n;
    find_primes();
    
    while(scanf("%d", &n) != EOF) {
        if(n == 0) break;
        int mid = n / 2;
        int res = 0;
        // 直接从素数表开始循环,素数表中存放的值为素数。
        for(int i = 0; i < cnt; i++) {
            // 重点是这里的下标别搞错了!!!
            if(primes[i] <= mid && !p[n-primes[i]]) {
                res++;
                //printf("(%d,%d)\n", primes[i], n-primes[i]);
            }
            else if(primes[i] > mid) break;
        }
        printf("%d\n", res);
    }   
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读