寻找素数n的优化方法

时间:2016-07-29 12:46:20

标签: c algorithm

我是通过使用此函数为每个值k=3n检查k(给定上限值)来执行此操作。如何对其进行优化以将所有素数数据都计入数组中的n,而不需要检查每个数字k

int primeCheck(long long int k) {
    int j;
    int isPrime = 1;
    int sr = (int)sqrt(k);
    for (j = 2; j <= sr; j++) {
        if (k % j == 0) {
            //printf("=========== %d|%d\n", num,num2); // uncomment this to see if a number is divisible
            isPrime = 0; // this number is not prime, cos num can be divided by num2
            break;
        }
    }
    if (isPrime) {
        return isPrime; // reset the check parameter
    } else {
        return 0; // reset the check parameter
    }
    return 0;
}

3 个答案:

答案 0 :(得分:2)

尝试筛选Eratosthenes。该算法通过消除从2n的素数的所有因子来工作。

int main() {
    int n;
    scanf("%d", &n);
    int prime[n+1];
    for(int i = 0; i < n+1; i++)
        prime[i] = 0;

    for(int i = 2; i <= sqrt(n+1); i++) {
        if(prime[i] == 0) {
            for(int j = i*i; j <= n; j += i)
                prime[j] = 1;
        }
    }

    int prime_list[n], size = 0;
    for(int i = 2; i <= n; i++) {
        if(prime[i] == 0)
            prime_list[size++] = i;
    }
}

例如,让数字最初为:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

  • 删除2的所有倍数(2除外)我们得到:

2 3 5 7 9 11 13 15 17 19 21 23 25 27 29

  • 删除3的所有倍数(3除外),我们得到:

2 3 5 7 11 13 17 19 23 25 29

  • 删除5的所有倍数(5除外),我们得到:

2 3 7 11 13 17 19 23 29

现在,将不再有删除,并且在对剩余的每个素数进行几次迭代后,这将是我们的最终列表。

prime[i]的{​​{1}}。我们将所有这些索引附加到另一个i = {2, 3, 7, 11, 13, 17, 19, 23, 29}向量中,如代码中所做的那样。该向量将给出prime_list的所有素数。

答案 1 :(得分:0)

你也可以在2.之后跳过偶数数字

int primeCheck(long long int k){
    if(k<=1 || k%2==0){    //if number is even return 0 its not prime
        return 0;
    }

    int sr = (int) sqrt(k);    //probable divisor

    for(int j=3;j<=sr;j+=2){
        if(k%j == 0){
            //printf("=========== %d|%d\n", num,num2); // uncomment this to see if a number is divisable
            return 0; //if number is not prime skip everything and return zero
        }
    }
    return 1; //if loop completes i.e. not divisor found then return return 1
}

答案 2 :(得分:0)

如果你想检查范围内的很多数字,我建议使用Sieve of Eratosthenes算法。

你的功能可能会更好一点:

int primeCheck(long long int n)
    {
        if (n <= 1)
        {
            return 0;
        }
        if (n <= 3)
        {
            return 1;
        }
        if (n % 2 == 0 || n % 3 == 0)
        {
            return 0;
        }
        int sr = (int)sqrt(n);

        for (int i = 5; i <= sr; i += 6)
        {
            if (n % i == 0 || n % (i + 2) == 0)
            {
                return 0;
            }
        }
        return 1;
    }