Hipoteza Goldbacha - sprawdzenie programu w C

0

Program ma wypisywać liczbę możliwych sposobów przedstawienia wpisanej liczby, jako sumy dwóch liczb pierwszych. (p+q, gdzie p <= q)
Np. po wpisaniu 16, program powinien wypisać 2, bo 3+13=16 i 5+11=16
Gdzie jest błąd?

#include <stdio.h>
#include <math.h>

int czypierwsza(int a) {
    for(int i=2; i<=sqrt(a); i++) {
        if(a%i==0)
            return 0;
    }
    return 1;
}

int main(int argc, const char * argv[]) {
    int n;
    scanf("%d",&n);
    if((n%2==0) & (n>2)) {
        int licznik=0;
        for(int i=2; i<=n; i++) {
            for(int j=i; j<=n; j++) {
                if(i+j==n) {
                    if((czypierwsza(i)==1) & (czypierwsza(j)==1)) {
                        licznik++;
                    }
                }
            }
        }
        printf("%d",licznik);
    }
    else {
        printf("NIEPOPRAWNA LICZBA");
    }
    return 0;
}
1

Oesusmaria jakie to będzie niewydajne (na oko O(n^3)).

Parę rzeczy wypada poprawić:

  • wpierw policz wszystkie liczby pierwsze mniejsze od podanej, można to łatwo zrobić w czasie O(n \log{\log{n}})
  • idąc od początku tablicy do jej połowy sprawdzasz dla każdej z liczb czy dana - pierwsza znajduje się w drugiej połówce, jeśli tak, to zwiększasz licznik, złożoność O(n \log{n}) jeśli użyjemy szukania binarnego
0

jak używasz mnożenia zamiast dodawania, to czemu się dziwisz, że twój kod źle liczy?
Poza tym posłuchaj rad hauleth

0
MarekR22 napisał(a):

jak używasz mnożenia zamiast dodawania, to czemu się dziwisz, że twój kod źle liczy?
Poza tym posłuchaj rad hauleth

Mnożenia? Nie rozumiem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1