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)