Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача на подпрограмму

Автор: eldar219 6.04.2010 0:24

Составить программу для нахождения делителей некоторого числа



Плизз помогите как начать решать

Автор: Unconnected 6.04.2010 0:51

Можно так:



Procedure divz(n:integer);
var i:byte;
begin
for i:=1 to n do if (n mod i=0) then writeln(i);
end;

var n:integer;
begin
writeln('Vvedite N');
readln(n);
divz(n);
readln;
end.

Автор: Lapp 6.04.2010 8:18

Цитата(Unconnected @ 5.04.2010 21:51) *
  for i:=1 to n do if (n mod i=0) then writeln(i);

Вопрос: нужно ли делать цикл аж до n? ))

Автор: Unconnected 6.04.2010 16:37

А почему бы и нет?) n тоже является делителем самого себя...

Автор: volvo 6.04.2010 16:50

Цитата
n тоже является делителем самого себя...
Для того, чтобы это показать - совсем не обязательно цикл продолжать до N. Все проще гораздо...

Автор: Unconnected 6.04.2010 23:27

Вот так:


Procedure divz(n:integer);
var i:byte;
begin
writeln(n);
for i:=1 to (n div 2) do if (n mod i=0) then begin
writeln(i);
end;
end;

var n:integer;
begin
writeln('Vvedite N');
readln(n);
divz(n);
readln;
end.


Т.к. из двух множителей один не может быть меньше двух в нашем случае.

Автор: Lapp 7.04.2010 11:27

Цитата(Unconnected @ 6.04.2010 20:27) *
Вот так:
  for i:=1 to (n div 2) do if (n mod i=0) then begin ...

Т.к. из двух множителей один не может быть меньше двух в нашем случае.
Гм. Тогда, может быть, и начинать не с 1? smile.gif

Unconnected, думай дальше. Ты прошел некоторую часть пути, но не до конца )).

Автор: TarasBer 7.04.2010 15:23

Можно даже до половины не идти.

Автор: Lapp 8.04.2010 10:21

Цитата(TarasBer @ 7.04.2010 12:23) *
Можно даже до половины не идти.
Именно так yes2.gif . Но уважаемый Un отмалчивается.. smile.gif

Автор: Unconnected 8.04.2010 16:58

Ммм ну не знаю, я с циклом for ничего больше не придумал, кроме как:

Procedure divz(n:integer);
var i,i2:byte;
begin
writeln(n);
i2:=1;
for i:=n div 2 downto i2 do if (n mod i=0) then begin
writeln(i);
inc(i2,n div i);
end;
end;

var n:integer;
begin
writeln('Vvedite N');
readln(n);
divz(n);
readln;
end.



Но тут количество итераций то же самое вроде. Есть подозрение, что там можно делать допустим n div 5 и потом что-то домножать, но не додумался до конца)

Автор: Client 8.04.2010 17:04

lol.gif
думаю, имелось в виду после цикла сделать

writeln(n);

И можно идти до значения корня из числа smile.gif

Автор: Unconnected 8.04.2010 17:10

Цитата

И можно идти до значения корня из числа smile.gif


И как ты себе это представляешь?smile.gif

Автор: Client 8.04.2010 17:13

for i:=2 to round (sqrt(n) )

Автор: Lapp 8.04.2010 17:40

Цитата(Client @ 8.04.2010 14:13) *
for i:=2 to round (sqrt(n) )
Угу )). Только можно даже не Round, а Trunс.
И есть еще одна вещь, которую следует упомянуть..

Автор: Client 8.04.2010 17:59

тут возможно:
1) можно включить и единицу
2) возможно есть делитель n/2
3) ну и само число n
smile.gif

Автор: TarasBer 8.04.2010 18:13

Народ, автор же ещё даже ни одного ответа не сделал. А то так всё и раскроем.