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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2011, 01:27   #1
Seferus
Пользователь
 
Регистрация: 18.09.2010
Сообщений: 56
Сообщение For

Найти все трехзначные числа, которые содержат только нечетные цифры. Помогите с этой задачкой пожалуйста
Seferus вне форума Ответить с цитированием
Старый 02.10.2011, 01:55   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

господа студеоузы, указывайте же, наконец, язык!!
Pascal:
Код:
for i:=0 to 4 do
  for j:=0 to 4 do
    for k:=0 to 4 do
      Writeln((i*2+1)*100+(j*2+1)*10+k*2+1);
C++:
Код:
for (i=1; i<=9; i+=2)
  for (j=1; j<=9; j+=2)
    for (k=1; k<=9; k+=2)
      cout << i*100+j*10+k << endl;

Добавлено:
Упс, извиняюсь, my bad - не посмотрел, в каком разделе нахожусь.. ))
ладно, не буду стирать )
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 02.10.2011 в 01:59.
TinMan вне форума Ответить с цитированием
Старый 02.10.2011, 01:59   #3
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Если скорость не важна, то самое простое на мой взгляд IntToStr + if ch in ['1', '3','5','7','9'] then
_Engine_ вне форума Ответить с цитированием
Старый 02.10.2011, 10:46   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

_Engine_,
во-первых, в Паскаль нет IntToStr (это Дельфийская функция).
Тогда уже str()

во-вторых, это сложнее (помимо основного цикла от 100 до 999 нужно будет ещё и цикл по строке организовывать)

в-третьих, а чем Вам вариант от TinMan с тремя циклами не понравился?! Чётко, быстро, понятно, надёжно.

в-чётвёртых, разумеется, такую задачу можно решить множеством способов.
вот, например, так:
Код:
for i:=100 to 999 do
  if odd(i div 100)  and 
       odd((i div 10) mod 10) and 
           odd(i mod 10) then
      WriteLn(i);
но мне вариант решения от TinMan всё равно больше нравится!

Последний раз редактировалось Serge_Bliznykov; 02.10.2011 в 10:48.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.10.2011, 08:39   #5
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Случайно забежал в эту тему снова..
Цитата:
но мне вариант решения от TinMan всё равно больше нравится!
Спасибо! ))
Это решение, наверное, самое быстрое, но у него есть ооочень большой (IMHO) недостаток: оно не масштабируется. Я написал его потому, что оно максимально хорошо гармонирует с нзванием темы - в нем только FOR, и ничего больше )). Я бы вряд ли стал его применять для практических целей (точнее - вряд ли такие узкие практические цели найдутся).
Решение, которое добавил Серж, имеет избыточно длинный цикл, но ЗАТО это полпути к масштабируемости - и это может оказаться важнее. Для полного воплощения масштабирования нужен цикл для разбиения на цифры. Как-то так..
Код:
var
  i,n: LongInt;
begin
  write('введите длину чисел: ');
  readln(n);
  for i:= round(exp((n-1)*ln(10))) to round(exp(n*ln(10)))-1 do begin
    n:= i;
    while Odd(n) do n:= n div 10;
    if n=0 then write(i,' ')
  end
end.
- забавно, что даже в таком простом коде можно найти интересные ходы, рекомендую вникнуть )). А если использовать функции, то будет еще немного красивее:
Код:
var
  i: LongInt;

function AllOdd(n: LongInt): boolean;
begin
  while Odd(n) do n:= n div 10;
  AllOdd:= n=0
end;

begin
  write('введите длину чисел: ');
  readln(i);
  for i:= round(exp((i-1)*ln(10))) to round(exp(i*ln(10)))-1 do
    if AllOdd(i) then write(i,' ')
end.
- обратите внимание на то, что в глобальных переменных осталась одна только i . Хотя, для настоящей элегантности все же нужен C..

Чтобы сделать одновременно И масштабируемо, И без лишних проходов, нужна рекурсия, а она сама по себе неэффективна ((, да и не по теме. Можно, конечно, обойтись без нее, но только ценой сложных конструкций с массивами..

Решение с переводом в строку - я признаю, что в нем есть своя соль, и оно может иногда быть полезным, но у меня к таким вещам какая-то внутренняя неприязнь - нет в них изюминки (помимо их малой эффективности)). К слову сказать, недавно я пытался написать решение для палиндромов (в этой теме) и тоже не захотел использовать строки. Но палиндромы - как раз именно тот случай, где лучше использовать именно их. В результате я все же сделал, но это стоило мне немалых трудов )). В той теме на мой призыв никто не откликнулся - пожалуй, я сейчас все же выложу тот код, чтоб "продукт не пропадал" )).
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 04.10.2011, 11:38   #6
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

TinMan
Цитата:
Это решение, наверное, самое быстрое, но у него есть ооочень большой (IMHO) недостаток: оно не масштабируется.
Если известно, что входные данные не будут расширяться, можно и написать неуниверслаьный вариант, не имеющий возможности масштабироваться, тем самым, сэкономив время на его реализацию.

Цитата:
Чтобы сделать одновременно И масштабируемо, И без лишних проходов, нужна рекурсия, а она сама по себе неэффективна ((, да и не по теме. Можно, конечно, обойтись без нее, но только ценой сложных конструкций с массивами..
Несмотря на то, что рекурсию называю мощным инструментом, по мне она неприемлема. Например, при больших входных данных возникнет переполнение стэка, в то время как без рекурсии алгоритм будет "устойчивее", хоть и, возможно, более долгим.
Вадим Мошев вне форума Ответить с цитированием
Старый 05.10.2011, 20:03   #7
Seferus
Пользователь
 
Регистрация: 18.09.2010
Сообщений: 56
По умолчанию

TinMan спасибо огромное ты очень помог!
Seferus вне форума Ответить с цитированием
Ответ


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