Sprawdzenie czy liczba jest pierwsza

Sprawdzenie czy liczba jest pierwsza
US
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 172
0

Napisalem prosty kod ktory mial to sprawdzac ale niestety ma problem w obliczeniach zmiennoprzecinkowych,

Kopiuj
int main(void){
  int a=0;
  int i=0;
  printf("; ");
  scanf("%d", &a);
  for(;i<=a;++i){
    if(a%i==0)
      printf("NIE");
    else
      printf("TAK");
  }
  return 0;
}

co tu jest zle ? Moze cos poza zmiennoprzecinkowoscia tez.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

1.Podziel to na funkcje.
2.Nie możesz od razu wypisywać wyniku. Najpierw musisz przecież sprawdzić wszystkie liczby, zanim się okaże czy jest pierwsza, czy nie :P
3.Jaka zmiennoprzecinkowość?

US
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 172
0
Kopiuj
for(;i<=a;++i){
    if(a%i==0)

myslalem ze tu to sprawdzam, nie wiem wiec co mam zrobic

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

No sprawdzasz, ale jedną liczbę, a potem od razu wypisujesz wynik, a musisz najpierw przelecieć wszystkie liczby w pętli, a dopiero potem wypisać wynik, bo będąc w pętli jeszcze nie wiesz czy jest pierwsza, czy nie - dopiero to sprawdzasz.

Poza tym masz tam dzielenie przez zero.
Ile Twoim zdaniem wynosi na przykład 11%0?

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
1

Zdecydowanie zbyt duży zakres zmiennej sterującej i. Wystarczy od 2 do sqrt(a).

US
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 172
0
Kopiuj
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void){
  int a=0;
  int i=2;
  printf("; ");
  scanf("%d", &a);
  if(a<2){printf("NIE");}
  if(a==2){printf("TAK");}

  for(;i<=sqrt(a);++i){
    if(a%i==0){
      printf("NIE");
    }
    else{
      printf("TAK");
    }
  }
  return 0;
}
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Plus w pętli możesz inkrementować +2, tj. i += 2;.
Natomiast tak czy siak do zmiany została treść tej pętli jeszcze.

US
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 172
0

nie wiem co tam zmienic

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

No pomyśl - nie może być printfa wewnątrz pętli. To co tam wrzucisz zamiast niego?
Jakąś zmienną może?

MI
  • Rejestracja: dni
  • Ostatnio: dni
1

Nie rozumiesz co robisz:
Bierzesz liczbę a = 9.

  1. Sprawdzasz czy liczba 9 jest mniejsza od 2, nie jest więc idziemy dalej
  2. Sprawdzasz czy liczba 9 jest równa 2, nie jest, wiec idziemy dalej
  3. Zaczynamy pętlę
    3.1.0 i = 2
    3.1.1 sprawdzasz czy a(9) jest podzielna przez i(2), wychodzi, że nie jest podzielna, więc wypisujesz TAK. Wypisałeś ze liczba 9 jest liczba pierwszą. Jest? Oczywiscie ze nie jest, bo w kolejnym przejścu pętli:...

3.2.0 i==3
3.2.1 sprawdzasz czy a(9) jest podzielna przez i(3), wychodzi, że jest podzielna, więc wypisujesz NIE. Teraz wypisałeś że nie jest liczba pierwszą. Ale wcześniej napisałeś ze jest, wiec jak, jest czy nie jest?

3.3.0 i==4
3.3.1 sprawdzasz czy a(9) jest podzielna przez i(4), wychodzi, że nie jest podzielna, więc wypisujesz TAK. Teraz wypisałeś że jest liczba pierwszą. Ale wcześniej napisałeś ze nie jest a jeszcze wcześniej, że też jest, wiec jak, jest czy nie jest? Dla jednej liczby a=9 dostałeś 2 odpowiedzi że jest liczbą pierwszą i jedna, że nie jest.

Konkluzja. Najpierw musisz przelecieć cały zakres od 2 do sqrt(a) i NIE WYPISYWAĆ tylko na ustawiać sobie jakiegoś boola na false, zawsze jak reszta z dzielenia będzie 0. Potem, po przeleceniu całego fora na końcu po forze sprawdzasz, czy bool jest true czy false i DOPIERO WTEDY wypisujesz informację czy pierwsza czy nie.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
  isPrime = 1;
  for(;i<=sqrt(a);++i){
    if(a%i==0){
      printf("NIE");
      isPrime = 0;
      break; //po co dalej sprawdzać?
    }
  }
  if(isPrime == 1)
      printf("TAK");
MI
  • Rejestracja: dni
  • Ostatnio: dni
0

Można jeszcze to rozszerzyć i dzielic nie przez kolejne liczby, a przez liczby pierwsze mniejsze od sqlrt(a).

US
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 172
0

Okej chyba mam i juz jest ok tak mysle

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

int main(void){
  int a=0;
  int i=2;
  int q;
  int w;
  printf("; ");
  scanf("%d", &a);
  if(a<2){printf("NIE");return 1;}
  if(a==2){printf("TAK");return 1;}

  for(;i<=sqrt(a);++i){
    if(a%i==0)
      q=1;

    else
      q=2;
	}
  if(q=1){printf("NIE");return 1;}if(q=2){printf("TAK");return 1;}
  return 0;
}
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Nie, nie jest ok.
W ifie masz przypisanie, a nie porównanie, poza tym ten kod jest nieczytelny.

US
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 172
0

okej jest teraz

Kopiuj
  for(;i<=sqrt(a);++i){
    if(a%i==0){
      printf("NIE");
      s=0;
      break;
    }
  }
  if(s==1);
  printf("TAK");
  return 0;

ale czasem wypisuje podwojnie

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

if(s==1);
Ten średnik tutaj po co?

US
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 172
0

ahh :D okej kod sprawny dzieki : )

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.