Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск делителей числа [D7, XP]


cr@nk ©   (2008-01-25 09:14:00) 

Условие задачи:
Составить программу для графического изображения делимости чисел от 1 до n. В каждой строке напечатать очередное число и столько символов «+»,
сколько делителей у этого числа:
1+
2++
3++
4+++


Собственно саму задачу решил, но препод настаивает на решении более оптимальным способом (без использования массивов, это я просто на всякий случай уточняю)

var
 i, j, x, k: Word;
begin
 Write('Vvedite cheslo: ');
 Readln(x);
 for I := 1 to x do
 begin
   k := 0;
   Write(i);
   for j := 1 to i do
   begin
     if i mod j = 0 then
       Write('+');
   end;
   Writeln;
 end;
 Readln
end.


Собственно надо эту часть for j := 1 to i doоптимизировать. Говорят, что надо использовать корень числа (например для 20 корень из 20), но я не могу понять как


Anatoly Podgoretsky   (2008-01-25 11:04:00) [1]


> Просто рисовать плюсик.

Два плюса, если число больше 1


oldman   (2008-01-25 10:05:00) [2]

var
i, j, x, k: Word;
begin
Write('Vvedite cheslo: ');
Readln(x);
for I := 1 to x do
begin
  k := 0;А вот это зачем???
  Write(i);
  for j := 1 to Trunc(Sqrt(i)) do
  begin
    if i mod j = 0 then
      Write('+');
      if j<Trunc(Sqrt(i)) Write('+');
  end;
  Writeln;
end;
Readln
end.


Sergey13   (2008-01-25 09:51:00) [3]

> [8] oldman ©   (25.01.08 09:47)
> Для 1 тоже надо  Write('++'), поскольку число делится на
> 1 и на самое себя

Я имел в виду, что это можно и не анализировать IF-ом. Просто рисовать плюсик.


oldman   (2008-01-25 09:47:00) [4]


> Sergey13 ©   (25.01.08 09:46) [6]
> Да иначинать цикл можно с 2, а не с 1. 8-)


Нет.
Для 1 тоже надо  Write('++'), поскольку число делится на 1 и на самое себя


Sergey13   (2008-01-25 09:46:00) [5]

Да иначинать цикл можно с 2, а не с 1. 8-)


oldman   (2008-01-25 09:46:00) [6]

Значит, оптимизация такая:

for j := 1 to Trunc(Sqrt(i)) do
...
    Write('++');
...

Только обдумать:
Если корень круглый, write('+') для корня...
Например 9 делится на 3, остаток 3


Семеныч   (2008-01-25 09:31:00) [7]

> oldman ©   (25.01.08 09:26) [3]

... который должен быть найден одновременно с делителем 2.


cr@nk   (2008-01-25 09:29:00) [8]

Спасибо. Что-то я не догадался сразу про это свойство


> for j:=1 to i/2

Малость ошибочная запись... число должно быть целочисленным ;)


oldman   (2008-01-25 09:26:00) [9]


> Семеныч   (25.01.08 09:25) [1]
> Максимальный делитель числа не может быть больше корня из
> этого числа.


У 10, например, есть делитель 5


Семеныч   (2008-01-25 09:25:00) [10]

Максимальный делитель числа не может быть больше корня из этого числа. Значит, незачем гнать цикл до самого числа, достаточно до корня из него.

for j := 1 to Trunc(Sqrt(i)) do ...


oldman   (2008-01-25 09:25:00) [11]


> Собственно надо эту часть for j := 1 to i do оптимизировать.
>  


for j:=1 to i/2
Число не может делиться на число, которое больше его половины без остатка
:)))


Наверх

Титульная страница Поиск, карта сайта Написать письмо