簡體   English   中英

C中的素數程序

[英]Prime number program in C

這個程序應該打印前 x 個素數,但我注意到它打印了一些非素數,例如 27 或 35。我已經看了幾個小時,但似乎什么也沒有彈出。 所以,如果你知道出了什么問題,請告訴我。

#include <stdio.h>
int main(){
    int i=0, cont=2, prim=2, quant;
    printf("Insert number of prime numbers you wish: ");
    scanf("%d", &quant);
    printf("The first %d prime numbers are:\n", quant);
    while(i<quant){
        if(prim%cont!=0 && (cont>1 && cont<prim)){
            cont++;
        }
        else if(prim%cont==0 && (cont>1 && cont<prim)){
            prim++;
        }
        else if(prim%cont==0 && cont==prim){
            printf("%d\n", prim);
            prim++;
            cont=2;
            i++;
        }
    }
    return 0;
}

更新

哇,好吧,所以 7 年后人們仍然偶然發現這個問題。 在過去的 7 年里,我的編碼能力有所提高,現在我看到了這個程序是多么低效。 以防萬一有人可能試圖為此找到解決方案並偶然發現這個問題,這里有三個更容易和更好的解決方案,以及它們為什么有效。

解決方案 1:第一個解決方案也非常低效,但它有效,而且非常容易理解。 基本上你要做的是檢查每個不超過上限的數字是否是質數。 為此,只需檢查它是否可以被任何數字整除到其平方根。

為什么是平方根? 因為平方根的平方等於數,也就是說,如果一個數不能被它的平方根整除,它就不能被它上面的任何數整除,要被它整除,就需要乘以一個較小的數。 例如,36的平方根是6,36能被9整除,即9*4=36。 但是因為 9 大於 6(即平方根),所以乘以 9 得到 36 的數小於 6,因此,我們已經看到它不是質數,因為我們已經檢查過 36 可以被整除4. 也就是說,如果一個數的平方根以下的數都不是該數的自然被除數,那么該數就是質數。

#include <stdio.h>

int isPrime(int num) {
    for (int i = 2; i*i <= num; i++) {
        if (num%i==0) {
            return 0;
        }
    }
    return 1;
}

void getPrimes(int num) {
    int cont = 0;
    for (int i = 2; cont < num; i++) {
        if (isPrime(i)==1) {
            printf("%d\n", i);
            cont++;
        }
    }
}

int main() {
    int quant;
    printf("Insert number of prime numbers you wish: ");
    scanf("%d", &quant);
    printf("The first %d prime numbers are:\n", quant);
    getPrimes(quant);
    return 0;
}

這是低效的,因為我們正在檢查數字是否可以被不會影響的數字整除(在下一個解決方案中對此有更多介紹)。

解決方案 2:在我認為更優雅的第二個解決方案中,我們使用了算術基本定理,該定理指出任何大於 1 的數字本身就是素數,或者可以通過乘法因式分解來表示的素數。 這意味着如果一個數可以被一個非素數整除,它也可以被構成它的素數整除,因此我們只需要檢查所討論的數字是否可以被比它本身更小的素數整除。 為此,我們將素數存儲在一個數組中。

#include <stdio.h>

void getPrimes(int num) {
    int primes[num];
    int cont = 1;
    primes[0] = 2;
    int current = primes[cont-1]+1;
    while (cont < num) {
        int before = current;
        for (int i = 0; i < cont; i++) {
            if (current%primes[i]==0) {
                current++;
                break;
            }
        }
        if (before == current) {
            primes[cont] = current;
            cont++;
            current++;
        }
    }
    for (int i = 0; i < cont; i++) {
        printf("%d ", primes[i]);
    }
    printf("\n");
}

int main() {
    int quant;
    printf("Insert number of prime numbers you wish: ");
    scanf("%d", &quant);
    printf("The first %d prime numbers are:\n", quant);
    getPrimes(quant);
    return 0;
}

解決方案 3:此最終解決方案是上述兩種解決方案的混合。 解決方案 1 檢查的數字不是素數,有冗余,而解決方案 2 檢查的數字大於平方根,如果較小的數字不是,則永遠不能成為股息。 在此解決方案中,我們檢查數字是否只能被平方根以下的素數整除。

#include <stdio.h>

void getPrimes(int num) {
    int primes[num];
    int cont = 1;
    primes[0] = 2;
    int current = primes[cont-1]+1;
    while (cont < num) {
        int before = current;
        for (int i = 0; (i < cont && primes[i]*primes[i] <= current); i++) {
            if (current%primes[i]==0) {
                current++;
                break;
            }
        }
        if (before == current) {
            primes[cont] = current;
            cont++;
            current++;
        }
    }
    for (int i = 0; i < cont; i++) {
        printf("%d ", primes[i]);
    }
    printf("\n");
}

int main() {
    int quant;
    printf("Insert number of prime numbers you wish: ");
    scanf("%d", &quant);
    printf("The first %d prime numbers are:\n", quant);
    getPrimes(quant);
    return 0;
}

比較每個算法對100個素數的執行時間,我們得到如下結果

算法 1 算法 2 算法 3
0.048 毫秒 0.068 毫秒 0.039 毫秒

與耗時 0.599 毫秒的原始帖子的算法相比,這些新解決方案中的每一個都更有效(最差的大約好 10 倍),並且實際上計算了真實值。

嘗試這個

#include<stdio.h>

int prime(int n)
{
    int i, j, len=1, brk=0;
    int list[200]={2};
    for(i=2; i<=n; i++)
    {
        for(j=0; j<len; j++)
        {
            if(i%list[j]==0){
                brk=1;
                break;
            }
            else
            {
                brk=0;
            }
        }
        if(brk==0)
        {
            list[len]=i;
            len++;
        }
    }
    for(i=0; i<len; i++)
        printf("%d ",list[i]);
}

main()
{
    int i, n;
    scanf("%d",&n);
    prime(n);
}

@PKDOJ 如果系列設置在 30 以內。您可以盲目使用下面的邏輯。 但沒有超過那個系列。 添加 i%11 也會清除 77。 效率不高

    if ((i % 2) && (i % 3) && (i % 5)&&(i%7)&&(i%11))

代碼:

int count = 0, quant = 5, i, j;

int flag = 0;
for(prim = 2 ; count <= quant ; prim ++) {
    flag = 0;
    for(j = 2; j < prim/2; j++) {
        if(prim % j == 0) {
            flag = 1;
            break;
        }
    }
    if(flag == 0) {
        printf("%d\n", prim);
        count++;
    } 
}

將您的代碼更新為:

while(i<quant){
    if(cont<prim) {
        if(prim%cont!=0) {
            cont++;
        } else {
            prim++;
            cont = 2; // restart cont
        }
    }
    else if(prim%cont==0 && cont==prim){
        printf("%d\n", prim);
        prim++;
        cont=2;
        i++;
    }
}

簡單的方法是找到:如果一個數不能被 2,3 & 5 整除,則它是一個質數。

#include <stdio.h>

int main()
{

    int num = 35;
    int i = 5;
    printf("1 2 3 5");
    while (i <= num)
    {
        if ((i % 2) && (i % 3) && (i % 5))
        {
                printf(" %d",i);

        }
        i++;
    }
    printf("\n");
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM