Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2013, 22:13   #1
leshiy_777
 
Регистрация: 09.12.2013
Сообщений: 5
По умолчанию Ввести натуральное число N. Вывести вначале все его четные, а затем нечетные делители

Ввести натуральное число N . Вывести вначале все его четные, а затем нечетные делители. Кто поможет, буду очень благодарен.
leshiy_777 вне форума Ответить с цитированием
Старый 18.12.2013, 23:47   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Я вижу два варианта.. 2 раза бежать до корня.. или использовать массив и потом бежать по нему..
Poma][a вне форума Ответить с цитированием
Старый 19.12.2013, 09:36   #3
Kemperh4
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 16
По умолчанию

Один из простейших способов...
Код:
Program chislo;
 var i,n,m1,m2:integer;
 mas1,mas2:array [1..100] of integer;
 begin 
 write('Введите натуральное число: ');
 readln(n);
 m1:=0;m2:=0;
 
 for i:=1 to n do begin
 
 if (n mod i = 0) and (i mod 2 = 0)then begin
 inc(m1);
 mas1[m1]:=i;
 end;
 
 if (n mod i = 0) and (i mod 2 <> 0)then begin
 inc(m2);
 mas2[m2]:=i;
 end;
 end;
 write('Четные делители: ');
 
 if m1 <> 0 then
 For i:=1 to m1 do
 write(mas1[i],' ');
 writeln;
 
 write('Нечетные делители: ');
 if m2 <> 0 then
 For i:=1 to m2 do
 write(mas2[i],' ');
 writeln;
 end.
Kemperh4 вне форума Ответить с цитированием
Старый 19.12.2013, 10:02   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

боюсь, что ваш код с массивами загнётся на достаточно большом числе! (или надо увеличивать размерность массивов)

я бы пробежался дважды:
Код:
program chislo;
var i, n, m1, m2: integer;
begin
  write('Введите натуральное число: ');
  readln(n);
  m1 := 0; m2 := 0;

  Write('Чётные делители числа: ');
  i := 2; {сначала все чётные делители числа}
  while i <= n do begin
    if (n mod i) = 0 then begin
      Write(i, ' ');
      Inc(m1);
    end;
    Inc(i, 2);
  end;
  if m1 = 0 then Write('<нет>');
  WriteLn;

  Write('НеЧётные делители числа: ');
  i := 1; {теперь нечётные делители числа}
  while i <= n do begin
    if (n mod i) = 0 then begin
      Write(i, ' ');
      Inc(m2);
    end;
    Inc(i, 2);
  end;
  if m2 = 0 then Write('<нет>');
  WriteLn;

  Readln
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.12.2013, 11:20   #5
Kemperh4
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 16
Радость

Serge_Bliznykov
Цитата:
боюсь, что ваш код с массивами загнётся на достаточно большом числе! (или надо увеличивать размерность массивов)
массив создается для делителей, для какого числа integer натуральных делителей больше 100? даже для 2 в степени n, число делителей будет не более 30
Думаю, что страхи необоснованны, а вот скорость выполнения будет в плюсе при одном проходе все-таки
Kemperh4 вне форума Ответить с цитированием
Старый 19.12.2013, 12:57   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
массив создается для делителей, для какого числа integer натуральных делителей больше 100?
во-первых, почему Integer, почему не LongInt ?

во-вторых, хорошо, возьмём тип Integer
во FreePascal/Delphi и т.д. win32 - Integer - это число:
Цитата:
Код:
Integer	–2147483648..2147483647	signed 32-bit
подсчитайте, сколько чётных делителей, например, у числа 48000000 (это далеко не максимальное число, так, просто для примера).

в-третьих, нравится Вам ваше решение больше - да на здоровье, оно вполне рабочее, и у него есть свои плюсы и минусы (о которых я и пытался сказать ).
Теперь у TC два разных решения, вот пусть TC выбирает, какое решение ему больше подходит.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.12.2013, 14:56   #7
Kemperh4
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 16
По умолчанию

Цитата:
во-первых, почему Integer, почему не LongInt ?
наверное потомучто у Вас в коде так указано
Код:
var i, n, m1, m2: integer;
со вторым пунктом я согласен, тут я упустил (упрощенно как-то взглянул на проблему )

ну а в третьих, мое решение мне не нравиться!!! это просто один из вариантов решения. У Вашего решения по факту для данной задачи преимущество в меньшем количестве выполняемых операций(сразу вывод в консоль) , в моем же вначале заполняются массивы а потом выводится их содержимое, если данные в дальнейшем использоваться не собираются - это лишнее использование ресурсов.

PS:
можно просто добавить код...
Код:
if n>10000 then begin 
Writeln();
Writeln('Число > 10 000 программа будет завершена');
halt(); 
end;
и немного изменить приветствие
Код:
 write('Введите натуральное число(не более 10 000): ');
и проблема переполнения массива уйдет сама собой
Kemperh4 вне форума Ответить с цитированием
Старый 19.12.2013, 20:18   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
и немного изменить приветствие
Я тоже так могу..
Код:
Write ('Введите натуральное A, не большее 1'); ReadLn(a);
WriteLn('1 нечетный делитель')
И, кстати, нет массивов и нет лишних проходов.. Красотаа..

Цитата:
во FreePascal/Delphi и т.д. win32 - Integer - это число:
Неа..
В Делфи, абц - да! Но в Free максимальное значение, которое может принимать Integer - 32767.. (если мы говорим, про "чистый" Фри, без всяких примочек ввиде режима совместимости с Делфи..)
Poma][a вне форума Ответить с цитированием
Старый 20.12.2013, 12:53   #9
Kemperh4
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 16
По умолчанию

Цитата:
Я тоже так могу..
Код:

Write ('Введите натуральное A, не большее 1'); ReadLn(a);
WriteLn('1 нечетный делитель')
Это уже утрирование,
если в задаче четко не указан верхний предел, его определяет программист.

можно ведь и такое число ввести:
Код:
[1546515416511654161654456464164565623165416161643514346547171837183738716381638163236863823872687128766827872381138138173324654]
и тоже вроде как натуральное...
Kemperh4 вне форума Ответить с цитированием
Старый 20.12.2013, 13:48   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но в Free максимальное значение, которое может принимать Integer - 32767
Да? А это тогда как обьяснить:
Цитата:
Integer = longint;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан массив. Вывести вначале все четные числа в порядке возрастания их индексов, затем - все нечетные в порядке убывания.( Delphi ) simonte Помощь студентам 9 07.12.2013 06:54
В массиве поставить вначале все четные, а затем все нечетные цифры в массиве (Написать программу в коде делфи) Murfik97 Помощь студентам 4 26.11.2013 21:26
Упорядочить массив так, чтобы вначале размещались четные цифры в порядке возрастания, а затем нечетные - в порядке убывания Маруся171996 Паскаль, Turbo Pascal, PascalABC.NET 1 22.11.2013 17:42
Вывести сначала все его четные (нечетные) елементы, а потом- нечетные(четные). tondo Помощь студентам 4 25.04.2012 00:17
Ввести натуральное число N . Вывести треугольник, содержащий N строк вида Arei15 Помощь студентам 2 31.10.2009 23:41