dzielniki naturalne liczby naturalnej

0

Witam!
Potrzebuje programu w pascalu wyszukującego wszystkie dzielniki naturalne dowolnej liczby naturalnej. Nie oczekuje od was "gotowca" (troche muszę sie pomęczyć) , ale brak mi pomysłu na algorytm wyszukujący te dzielniki i wypisujacy je na koncu. Może wspomożecie mnie chociaz schematem blokowym, jakims pomysłem po prostu?Pascala ucze sie dopiero pare dni, więc nie wymagajcie ode mnie za wiele.

0

Można dzielić tę liczbę przez kolejne liczby od 2 do tej liczby.
Aby to troche przyśpieszyć, to powiem ,że wystartczy jak podzielisz liczbe przez kolejno 2,3, aż do pierwiastka z liczby.

Troche nagmatwałem :|

Np. Masz znaleŹć dzielniki liczby a.
Więc dzielisz ją przez 2, 3, ..., aż do pierwiastka z a (ew. +1).
Liczba jest dzielnikiem, gdy reszta z dzielenia jest równa 0.

Chyba ci wystarczy... :-)

0

Aż do pierwiastka z a ???

To weźmy liczbę 100, jej pierwiastkiem jest 10, a dzieli się też przez 50... :-/

Najłatwiej:

for i := 1 to a do
  if i mod a = 0 then // liczba jest dzielnikiem
0

a dzieli się też przez 50... :-/

Ale to wykryjesz dzieląc przez 2.

0

panowie, ale dzieląc 100 przez 2 nie wykryję, ze 100 dzieli sie równiez przez 25 a przeciez 25 jest dzielnikiem naturalnym liczby 100.
Albo ja czegos tu nie kumam. Najprawdopodobniej :)

0

100 / 4 = 25

0

Spoko, na pewno będzie do pierwiastka z liczby. Taki jest algorytm. :-P

0
var
  a: Integer;
begin
  a := Trunc(Sqrt(liczba)+1);
  WriteLn('Dzielniki liczby ', liczba);
  for i := 1 to a do
     if liczba mod i = 0 then
       if i = liczba div i then
         Write(i)
       else
         Write(i, ', ', liczba div i, ', ');
0

dziękuję wszystkim za podpowiedzi! Wasze rady były naprawdę pomocne! Ijeszcze pytanie do Dryobatesa: "przetłumacz" mi sposób wypisywania ostatecznego wyniku - ostatnia linijka z Twojego kodu; po
wyświetleniu wszystkich dzielników wyświetla się na końcu jeszcze przecinek, ale nie zawsze. Nie przeszkadza mi to specjalnie lecz chciałbym wiedziec za co odpowiada każdy znak w tym programie.
Pozdrawiam i stawiam piwo w podzięce: [browar]

0
if i = liczba div i then
         Write(i)
       else
         Write(i, ', ', liczba div i, ', ');

Jeżeli dwie ostatnie liczby są takie same (np. 6 i 6, dla 36), to wyświetli jedną i dlatego nie ma przecinka, a jeżeli takie same, to doda.
Akurat przecinek to tutaj jest przez przypadek, bo nie wypisywaniem się zająłem, a generowaniem. Przecinek to tylko dla wygody czytania :)
A opis działania już wcześniej podali moi poprzednicy. Jedyne co jest dodatkowe, to to, że parami wyznacza liczby, gdyż podany wcześniej sposób daje jedynie dzielniki 1..sqrt(liczba), więc co najwyżej połowę z nich. Zwykle liczba ma parzystą liczbę dzielników (ab = c), ale jeżeli jest ona kwadratem jakiejś liczby naturalnej, to ma ich nieparzystą liczbę (aa = c). I tylko po to jest ten dodatkowy parametr i przypadkowy przecinek :)
Można to oczywiście zrobić efektywniej, ale to jedynie wskazówka.

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