Wypisywanie liczb pierwszych.

0

Napisz program, który wczytuje liczbę naturalną n i wypisuje wszystkie liczby pierwsze z zakresu od n do 2. Pomoże ktoś poprawić kod , bo źle działa?

 #include <stdio.h>
	int main (){
	int i,n,d;
	d=1;
	scanf("%d", &n);
	while(n>0){
	for(i=2;i<=n;i++){
	if(n%i==0){d++;}
	if (d>2)
	{printf("liczba nie jest pierwsza%d\n",n);}
	else
	{printf("liczba jest pierwsza%d\n",n);}
	--n;}}
	return 0;
}
1

Zacznijmy od jakiegoś ludzkiego formatowania:

#include <stdio.h>
int main()
{
    int i, n, d;
    d = 1;
    scanf("%d", &n);
    while (n > 0) {
        for (i = 2; i <= n; i++) {
            if (n % i == 0) {
                d++;
            }
            if (d > 2) {
                printf("liczba nie jest pierwsza%d\n", n);
            } else {
                printf("liczba jest pierwsza%d\n", n);
            }
            --n;
        }
    }
    return 0;
}

Warunkiem zadania jest wypisanie liczb pierwszych, a nie czy dane liczby są pierwsze czy nie - wywal zbędne printfy.

Sprawdznie czy liczba jest pierwsza wyodrębnij do osobnej funkcji.

Nie wiem o co chodzi z d - to kompletnie nie ma sensu.

0

Gdybyś go sam pisał pewnie by działał lepiej i próbował robić to co jest w poleceniu.
yyyy o co chodzi z tym pomidorem?

3

Polecam zapoznanie się z sitem Eratostenesa.

0

zrobiłem nowy kod i mam co do niego pytanie gdzie i dlaczego powinienem użyć funkcji "break"?

#include <stdio.h>

main()
{
    int a,b;

    printf("wprowadz liczbe\n");
    scanf("%d",&a);

    if ( a == 2){
        printf("liczba pierwsza.\n");
    } else {
        for (b=2; b<=a-1; b++){
            if( a % b == 0 )
            if ( b != a )
            printf("to nie jest liczba pierwsza.\n");
         else {
            printf("liczba pierwsza.\n");
        }
    }
    return 0;
}
0

po pierwsze, ta linijka if ( b != a ) jest zbędna (na wskutek fora zawsze będzie prawdziwa). Po drugie, break przyda się po ustaleniu że liczba nie jest pierwsza (w tym przypadku sprawdzanie większych nie ma sensu) . po trzecie poczytaj o tym sicie, bo ten program dla dużych i pierwszych n będzie długo działał.

0

gdzie zrobiłem błąd proszę o jakieś naprowadzenie mnie

 #include <stdio.h>
    int main(){
        int a,b;
        printf("podaj liczbe\n");
             scanf("%d\n", &a);
         if(a==2){
            printf("liczba pierwsza\n");}
         else{
                    for(b=2;b<=a-1;b++){
                        if(a%b==0)
                            break;}
                        printf("nie pierwsza");
                            else{
                        printf("parzysta");}
             }
  return 0;
}
0

Sformatuj to sobie porządnie, od razu będzie widać co jest spieprzone.

#include <stdio.h>
int main()
{
    int a, b;
    printf("podaj liczbe\n");
    scanf("%d\n", &a);
    if (a == 2) {
        printf("liczba pierwsza\n");
    } else {
        for (b = 2; b <= a - 1; b++) {
            if (a % b == 0)
                break;
        }
        printf("nie peirwsza");
        else
        {
            printf("parzysta");
        }
    }
    return 0;
}
0

Teraz program działą poprawiłem go z małą pomocą, ale nie rozumiem dlaczego musi być to c++ i n-- jakaś dobra dusza mogła by mi to wytłumaczyć?

 #include <stdio.h>
 int main(){
 int n,c;
    printf("Wpisz liczbe\n");
    scanf("%d",&n);
     if(n==2){
     printf("liczba pierwsza\n");}
            while(n>2){
            for(c=2;c++;n--){         
             if(n%c==0){   
                break;
               }
               }
                
            printf("nie pierwsza");
              else{
            printf("pierwsza");}
return 0;
                
            

}

1

Ten kod nie ma prawa się skompilować i tak dokładnie jest: http://melpon.org/wandbox/permlink/s3QmocgqdJaE5zVs

Sformatuj sobie go po ludzku to zobaczysz co jest źle (to co napisałem w komentarzu wcześniej: else znikąd):

#include <stdio.h>
int main()
{
    int n, c;
    printf("Wpisz liczbe\n");
    scanf("%d", &n);
    if (n == 2) {
        printf("liczba pierwsza\n");
    }
    while (n > 2) {
        for (c = 2; c++; n--) {
            if (n % c == 0) {
                break;
            }
        }

        printf("nie pierwsza");
        else
        {
            printf("pierwsza");
        }
        return 0;
    }

Jak sam masz problem z formatowaniem albo uważasz, że Twój sposób jest lepszy (ha!) to przynajmniej przed postowaniem przepuść go przez http://format.krzaq.cc

0

Ok a teraz ktoś mi to wyjaśni?

 #include <stdio.h>
int main()
{
    int n, c;
    printf("wpisz liczbe\n");
    scanf("%d", &n);
    if (n == 2) {
        printf("liczba pierwsza");
    } else {
        for (c = 2; c++; n--) {
            if (n % c == 0) {
                break;
            }
        }
        if (c != n) {
            printf("liczba nie pierwsza");
        } else {
            {
                printf("liczba pierwsza");
            }
        }
    }
    return 0;
}
0

Wyjaśniam, że nie działa: http://melpon.org/wandbox/permlink/AfKfNwiC4Mh83ntu

c++ w środkowym wyrażeniu fora nie wydaje się zbyt dobrym pomysłem. Zrób sobie osobną funkcję do sprawdzania czy liczba jest pierwsza.

0

Jak to nie działa skoro w terminalu kompiluje mi się i po wpisaniu liczby pokazuje czy jest pierwsza czy nie.

0

Tak nie działa, że pokazuje, że 35 jest liczbą pierwszą.

1

Moim zdaniem warunek końca pętli powinien być c<=sqrt(n), jak do pierwiastka włącznie nic nie znajdziesz, to masz liczbę pierwszą.

0

chyba wkoncu wyszlo

 #include <stdio.h>
int main()
{
    int n, c;
    printf("wpisz liczbe\n");
    scanf("%d", &n);
    if (n == 2) {
        printf("liczba pierwsza");
    } else {
        for (c = 2; c <= n - 1; c++) {
            if (n % c == 0) {
                break;
            }
        }
        if (c != n) {
            printf("liczba nie jest pierwsza");
        } else {
            {
                printf("liczba pierwsza");
            }
        }
    }
    return 0;
}
0

Dobrze, to teraz przenieś sprawdzanie do osobnej funkcji, a potem zmniejsz liczbę iteracji do sqrt(n)

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