Wyszukiwanie kwadratów liczb pierwszych z listy liczb

0

ZAZNACZAM ŻE NIE PROSZĘ O ROZWIĄZANIE ZADANIA
Witam, otóż robię sobie zadanka maturalne z informatyki, i natrafiłem na takie:

W pliku o nazwie liczby.txt umieszczono w kolejnych wierszach 500 liczb całkowitych
dodatnich, po jednej w wierszu, z których każda liczba ma co najwyżej 6 cyfr. Napisz
program, za pomocą którego otrzymasz tylko te liczby z pliku liczby.txt, które są
kwadratami liczb pierwszych. Na przykład liczba 49 jest kwadratem liczby pierwszej –
49 = 72 . Wyniki zapisz w pliku zad_5.txt. Twój program powinien działać poprawnie
również wtedy, gdy plik liczby.txt będzie zawierał 500 innych liczb całkowitych
dodatnich, o co najwyżej 6 cyfrach, każda liczba w osobnym wierszu.

Napisałem taki programik, ale nie działa jak należy, a nie umiem zlokalizować błędu (a raczej nie jestem pewien czy nie znajduje mi liczb, których 'pierwiastek' jest liczbą całkowitą, czy problem tkwi już w sprawdzaniu czy dany pierwiastek jest liczbą pierwszą) Czy ktoś mógłby mi wskazać błąd w tym kodzie?

uses crt;

var
  tab : array[1..500] of real;
  tab2 : array[1..500] of real;
  tab3 : array[1..9] of real;
  x, y, l : real;
  x1, x2 : real;
  w1 : real;
  e : real;
  k, i, j, m, q : integer;
  w2 : integer;
  plik : text;
  c : char;

begin
  assign(plik, 'liczby.txt');
  reset(plik);
  for i := 1 to 500 do
    readln(plik, tab[i]);
  close(plik);

  q := 0;

{sprawdzanie czy liczba całkowita}
  for j := 1 to 500 do
  begin
    q := q + 1;
    x := 0;
    x := exp((1 / 2) * ln(tab[j]));
    x1 := trunc(x);
    x2 := x - x1;
{/sprawdzanie czy liczba całkowita}
{sprawdzanie czy liczba pierwsza}	
    if x2 = 0 then
    begin
      for k := 1 to 9 do
      begin
        tab3[k] := x / k;
        w1 := tab3[k] - trunc(tab3[k]);
        if w1 = 0 then w2 := w2 + 1;
        if w2 = 2 then begin w2 := 0; l := l + 1; end;

      end;
    end;
{/sprawdzanie czy liczba pierwsza}	
    if l = 2 then begin m := m + 1; tab2[m] := tab[j]; end;
  end;

  writeln(m);
  for i := 1 to m do begin e := exp((1 / 2) * ln(tab2[i])); writeln(e : 6 : 2); end;
  c := readkey;

end.

Zawartość liczby.txt:
http://pokazywarka.pl/m3dej6/
(500 wierszy, uznałem wrzucenie na pokazywarkę będzie lepsze)

0
  1. Tablice są tu zbędne. Możesz sprawdzić liczbę od razu po jej wczytaniu.
  2. Nie trzeba się tak męczyć by sprawdzić liczbę, wpisz sobie w google "jak sprawdzić czy liczba jest kwadratem liczby pierwszej"

Do dzieła młodzieńcze. :)

0

O patrz jaki dobry humor mam!

uses crt;
 
var
  x:real;
  i,j:longint;
  plik:text;
  c:char;
 
function Pierwsza(n: LongInt):Boolean;//Z http://4programmers.net/Algorytmy/Liczby_Pierwsze
var
 I,P: LongInt;   // Zmienna iteracyjna, oraz do zliczenia ilosc dzielnikow
begin
 P:=0; // Inicjacja zmiennej
 Pierwsza:= True; // Domyslnie, ustawienie ze liczba jest pierwsza
 
 if n = 1 then       // sprawdzanie wyjatku, czyli liczby 1
 begin
  Pierwsza:=False;
  Exit;
 end;
 
 for I:=1 to N do
  if N mod I = 0 then
   begin
    P:=P+1;      // Dodanie jednego dzielnika
    if P>2 then  // Jezeli ilosc dzielnikow jest wieksza niz 2 to:
    begin
     Pierwsza:= False; // Ustaw rezultat funkcji, na nieprawde (False)
     Break;          // Przerwij iteracje, gdyz nie potrzeba wiecej dzielnikow zliczac
    end;
   end;
end;

begin
  assign(plik, 'liczby.txt');
  reset(plik);
 
  for j := 1 to 500 do
  begin
    readln(plik,i);
    x:=sqrt(i);
    if pierwsza(round(x)) then writeln(i);
  end;
  close(plik);
  readkey;
end.
0

Pisalem to kiedys w liceum.. Te liczby trzeba rozlozyc na czynniki pierwsze, bo z tymi pierwiastkami nie dzia dla wszystkich przykladow. kiedys w liceum.. Te liczby trzeba rozlozyc na czynniki pierwsze, bo z tymi pierwiastkami nie dzia dla wszystkich przykladow.

0

@kopernik: nie ma po co rozkładać tutaj liczbę na czynniki pierwsze - to długo mogłoby trwać.
Można tak:
a) dla każdej liczby policzyć pierwiastek i sprawdzić, czy powstała wartość to liczba pierwsza za pomocą dowolnego testu,
b) robisz tablicę liczb pierwszych z zakresu [1,sqrt(999999)], dla każdej liczby liczysz pierwiastek i sprawdzasz, czy jest w tablicy,
c) robisz tablicę kwadratów liczb pierwszych z zakresu [1,999999], dla każdej liczby po prostu sprawdzasz, czy jest w tablicy.

0

A nie prościej znaleźć wpierw liczby pierwsze z zakresu [2,1000] i każdą podnieść do kwadratu?

0

ile liczb pierwszych jest w zakresie od 2 do 1000? Niewiele, pewnie około 200, wiec wystarczy zdefiniować tablicę (zbiór) z kwadratami tych liczb, a potem sprawdzać czy dane wejściowe występują w tej tablicy.
Do wygenerowania tej tablicy najlepiej napisać osobny program.

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