Sprawdzenie czy liczba jest pierwsza

0

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

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.

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ść?

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

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

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?

1

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

0
#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;
}
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.

0

nie wiem co tam zmienic

0

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

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.

0
  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");
0

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

0

Okej chyba mam i juz jest ok tak mysle

#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;
}
0

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

0

okej jest teraz

  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

0

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

0

ahh :D okej kod sprawny dzieki : )

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