Wyszukiwanie kwadratów liczb pierwszych z listy liczb

2011-08-04 02:35
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)

edytowany 2x, ostatnio: madmike, 2011-08-04 04:21
Taguj wątki nazwą języka/środowiska - madmike 2011-08-04 04:22

Pozostało 580 znaków

2011-08-04 03:10
O_o
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. :)


O̾..͠o
kolejny staruszek... - madmike 2011-08-04 03:16

Pozostało 580 znaków

2011-08-04 04:39
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.

Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.
edytowany 1x, ostatnio: payl, 2011-08-04 04:40
Eh... Przecież nasz młody zapaleniec napisał "ZAZNACZAM ŻE NIE PROSZĘ O ROZWIĄZANIE ZADANIA". :) - O_o 2011-08-04 15:18
Podpowiedziałeś - źle. Podałem rozwiązanie - źle. Więc wychodzi na to że nie da się odpowiedzieć na pytanie. - payl 2011-08-04 17:13

Pozostało 580 znaków

2011-08-04 05:44
Kopernik
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.

Pozostało 580 znaków

2011-08-04 08:14
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.


Not Found
The requested URL /wypasiona_sygnaturka.txt was not found in this brain.
-----
Human/1.0.00 (Earth) Server at Poland Port 65535

Pozostało 580 znaków

2011-08-04 08:59
bo
0

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

Trochę przesadziłem z zakresem, ma być [2,sqrt(999999)] - bogdans 2011-08-04 09:01
ja myślę, że [2,sqrt(sqrt(999999))] i porównywać z pierwiastkiem liczb z pliku. - Azarien 2011-08-04 09:20
@bo: o to między innymi chodziło w metodzie c). - mnbvcX 2011-08-04 09:38
Sorry, czytałem nieuważnie i uznałem, że chodzi o trzy etapy metody, a nie o trzy różne sposoby. - bogdans 2011-08-04 10:03

Pozostało 580 znaków

2011-08-04 09:52
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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