Wyszukiwanie kwadratów liczb pierwszych z listy liczb

Odpowiedz Nowy wątek
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

Odpowiedz
Liczba odpowiedzi na stronę

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