C 求给定值n以下素数的优化方法

C 求给定值n以下素数的优化方法,c,algorithm,C,Algorithm,我是通过对每个值k使用此函数从k=3检查到n(给定的上限值)来执行此操作的。我如何优化它以获取数组中的所有素数,直到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("===

我是通过对每个值
k
使用此函数从
k=3
检查到
n
(给定的上限值)来执行此操作的。我如何优化它以获取数组中的所有素数,直到
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;
}
int-primeCheck(long-long-int-k){
int j;
int-isPrime=1;
int sr=(int)sqrt(k);

对于(j=2;j你也可以跳过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
}
int-primeCheck(long-long-int-k){

如果(k如果您想检查范围内的大量数字,我建议使用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;
    }
int-primeCheck(long-long-int-n)
{

如果(n尝试使用Eratosthenes筛选。该算法通过消除从
2
n
的质数的所有因子来工作

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;
    }
}
intmain(){
int n;
scanf(“%d”和“&n”);
整数素数[n+1];
对于(int i=0;i对于(int i=2;i)来说,一个快速的优化方法是不检查所有偶数。(还有很多。可能从谷歌搜索埃拉托什尼筛开始)从一个只包含[2]的素数数组开始,计数器设置为1。然后,检查从3开始的每个奇数,使用迄今为止找到的素数数组检查新数是否为素数,每次找到新素数时,将其附加到素数数组中,并递增到目前为止找到的素数。
prime
不需要如此大的类型,
无符号字符就足够了。名称本身令人困惑。使用
calloc()
而不是通过VLA分配它的风险较小,VLA将为任何足够大的
n
值调用未定义的行为。