C i liczba pierwsza


(sandra1) #1

skręciłem program sprawdzający czy podana liczba jest liczbą 1 .Czasem program pokazuje dobrą odpowiedz czasem złą . Może ktoś mnie nakierować na błędy?

#include 

#include 


int main()

{

     int p, i; //podano 2 zmiene p oraz i


     printf("Podaj liczbe: ");

     scanf("%d", &p); //wczytano p

   if(p % i ==1 && p % i == p ){ //jeśli reszta z dzielenia z p=0

   printf("jest liczba pierwsza.\n");

}else{ printf("nie jest liczbą 1\n");



  }   

     return 0;

}

(Drobok) #2

Zacznijmy od tego, że liczna pierwsza jest pierwsza kiedy dzieli się TYLKO przez 1 i przez samą siebie.

Twój program zwraca zawsze jest pierwsza z wyjątkiem gdy podasz 0. Bo tylko dla 0 reszta z dzielenia przez 1 dla 0 daje 1 :stuck_out_tongue:

Zacznij może od najbardziej łopatologicznej metody sprawdzenia wszystkich liczb po kolei do liczby którą podasz od 2 (bo przez 1 podzielić się musi). Jeśli coś znalazłeś wyświetl że nie jest pierwsza a w przeciwnym wypadku że jest.

Potem zauważ, że iterację możesz skrócić do sqrt(p)

a na końcu użyj sita erastotenesa :stuck_out_tongue:


(sandra1) #3

Dzięki za szybką podpowiedz. Wiem o co chodzi ale nie wiem jak to przedstawić.


(Drobok) #4

Jak ci chodzi o gotowca skorzystaj z forumowej wyszukiwarki tematów liczba pierwsze były dziesiątki.


(sandra1) #5

Czyli w punktach:

  1. Pobierz kolejną liczbę

  2. Przyjmij jako dzielnik liczbę 2

  3. sprawdź, czy reszta z dzielenia przez dzielnik = 0?

3a. jeśli tak, wróć do 1.

  1. Zwiększ dzielnik o 1.

  2. sprawdź czy dzielnik>1/2 badanej liczby

5a. Jeśli nie, wróć do 3.

  1. Zapisz/wypisz liczbę i zwiększ licznik znalezionych liczb pierwszych

  2. wróć do 1.

tylko na czym to oprzeć na for?


(Drobok) #6

Liczba L1 jest podzielna przez L2 jeśli reszta z dzielenia wynosi 0. if(L1%L2==0) //liczba L1 jest podzielna przez L2

Ogólnie bez pobierania kilku liczb wyglądało by to tak:

Jeśli chcesz powtarzać wrzucasz w kolejną pętlę.

Najkrócej forem, Oczywiście jeden kij jaka pętla.


(sandra1) #7

nie rozumiem twojego zapisu


([alex]) #8

sandra1 , mów od razu które słowo jest niezrozumiałe.


(floyd) #9

Już wiesz, że masz sprawdzać czy dana liczba dzieli się przez inne liczby od niej mniejsze i większe od 1.

W tym celu wykonuj nie normalne dzielenie ale dzielenie modulo czyli takie dzielenie którego wynikiem jest właśnie reszta z dzielenia dwóch liczb.

W normalnym dzieleniu 5/2=2,5 a w dzieleniu modulo 5/2=1 bo tyle wynosi reszta z dzielenia liczby 5 przez 2.

czyli w twoim przykładzie wykonujesz działanie: reszta == liczba mod i gdzie 'i' to kolejne liczby mniejsze od danej liczby i większe od 1. Jeśli reszta będzie równa zero to wychodzisz z pętli bo liczba nie jest pierwsza.

Jak tworzyć pętlę?

for( i = 2; i <= liczba); ++i )

{

'tu obliczanie reszty z dzielenia liczby przez liczbę 'i' która się zwiększa za każdym obiegiem pętli o 1'

if (reszta==0) break;

}


(sandra1) #10

Nie wiem jak opisać punkt piąty.

narazie mam coś takiego:

 

main(){


(kostek135) #11

@sandra1


(sandra1) #12

ja się dopiero uczę ok i popełniam błędy


(kostek135) #13

No i? Mamy nad tym płakać, bo nie rozumiem?


(sandra1) #14

nie masz a gotowca nie chce


(enedil) #15

Jeszcze raz:

  1. Tworzysz pętlę for(i = 2; i <= liczba; i++)

  2. W pętli sprawdzasz, czy $liczba jest podzielna przez $i: if(liczba % i == 0).

  3. Jeżeli tak, to najpierw piszesz, że $liczba jest złożona, a potem kończysz pętlę (instrukcja "break").

  4. Jeżeli nie, to zostawiasz resztę pustą. Pętla przechodzi do kroku 2.

  5. Gdy $liczba == $i, to piszesz, że $liczba jest pierwsza.


(Protected_48) #16

Sandra po prostu należy wykonać prostą iteracjną wersje. Nie baw się na początku w złożoność. Bardzo tutaj pomaga stworzenie funkcji, która zwraca TRUE lub FALSE. Możesz pomóc sobie schematem blokowym.

 

Pozdrawiam