[Pascal] Dzielniki pierwsze

Sylwek2
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 13 lis 2012, o 18:29
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 13 razy

[Pascal] Dzielniki pierwsze

Post autor: Sylwek2 »

Mam napisać program, który sprawdza, czy zachodzi relacja n~m dla dwóch liczb naturalnych dodatnich. Przy czym relacja n~m zachodzi o ile wszystkie czynniki pierwsze n są mniejsze od wszystkich czynników pierwszych m. Na przykład 12~175, ponieważ 12=2*2*3, 175=5*5*7.

Napisałem taki program, ale nie działa. Czy ktoś mógłby mi powiedzieć gdzie w nim znajduje się błąd?

Kod: Zaznacz cały


program relacja;
var m,n,i,dm,dn: integer;
begin
read(n,m);
i:=2;
begin{szukam najmniejszego dzielnika pierwszego m}
while(i<=m) do
begin
if m mod i=0 then
begin
dm:=i;
i:=m+1;{wyrzuca mnie z petli bo juz mam najmniejszy dzielnik}
end
else
i:=i+1;
end;
while(i<>n) do {szukam najwiekszego dzielnika pierwszego n}
begin
if n mod i=0 then
begin
dn:=i;
n:=n div i;
end
else
i:=i+1;
end;
if dn<dm then
write('Relacja zachodzi')
else
write ('Relacja nie zachodzi');
end;
readln;
end.
Rjiuk
Użytkownik
Użytkownik
Posty: 22
Rejestracja: 6 sty 2012, o 13:50
Płeć: Mężczyzna
Lokalizacja: Mszczonów
Podziękował: 1 raz
Pomógł: 1 raz

[Pascal] Dzielniki pierwsze

Post autor: Rjiuk »

Znajdujesz jedynie najmniejszą liczbę względnie pierwszą

Kod: Zaznacz cały

begin{szukam najmniejszego dzielnika pierwszego m}
od tego momentu sprawdzasz jedynie czy są one względnie pierwsze, a nie czy jest dzielnikiem pierwszym.

Sądzę, że najlepiej jeżeli jakoś stablicujesz liczby pierwsze , albo podczas sita Erastotenesa będziesz sprawdzać czy dana liczba pierwsza dzieli któraś z podanych .
Jytug
Użytkownik
Użytkownik
Posty: 73
Rejestracja: 10 gru 2012, o 12:21
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz
Pomógł: 11 razy

[Pascal] Dzielniki pierwsze

Post autor: Jytug »

Sylwek2 pisze:

Kod: Zaznacz cały

{szukam najwiekszego dzielnika pierwszego n}
begin
if n mod i=0 then
begin
dn:=i;
n:=n div i;
end
else
i:=i+1;
end;
W tym fragmencie jest problem. Żeby znaleźć największy dzielnik pierwszy n, najprościej jest wydzielić n przez kolejne liczby, przez które jest podzielne, w pętli while. Wówczas po wyjściu z pętli zmienna i przyjmie wartość największego dzielnika pierwszego n. Na przykład tak:

Kod: Zaznacz cały

i:=1;
while n>1 do
     begin
     i:=i+1;
     while n mod i = 0 do 
           begin
           n:=n div i;
           end;
     
     end;

dn:=i;
ODPOWIEDZ