Последовательность букв |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Последовательность букв |
Tauka |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 28 Репутация: 0 |
Последовательность состоит из латинских букв таким образом:
На первом этапе она пустая, на каждом следующем она удваивается и в конец добавляется следующая буква лат.алфавита (a, b, c, …).Задание: за заданным числом n, определить символ, который стоит на n-вом месте в последовательности, которую мы получили после 20 шагов. -------------------- С уважением,
Таука. |
xds |
Сообщение
#2
|
N337 Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: 26 |
Пусть 1 <= n < 2^20 - 1, тогда
1) решение "в лоб": Код program LatSeq1; var i, n: LongInt; procedure Rec(s: Integer); begin if s = 0 then Exit; Rec(s - 1); Rec(s - 1); if i = n then begin Writeln(Chr(s + Ord('a') - 1)); Halt; end; Inc(i); end; begin Write('n>'); Readln(n); i := 1; Rec(20); end. 2) решение 1) после небольшой оптимизации: Код program LatSeq2; var n, m: LongInt; s: Integer; begin Write('n>'); Readln(n); s := 20; while n <> LongInt(1) shl s - 1 do begin Dec(s); m := LongInt(1) shl s - 1; if n > m then Dec(n, m); end; Writeln(Chr(s + Ord('a') - 1)); end. -------------------- The idiots are winning.
|
APAL |
Сообщение
#3
|
Смотрю... Группа: Пользователи Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: 6 |
Я что-то не врубился в ход решения...
А где сама последовательность? Или все обошлось без нее? Каюсь, слишком сильно не вникал, но чего-то я не понял.... xds , поясни пожалуйста, а то я в недоумении - либо я тупой, либо ты гений! -------------------- |
Atos |
Сообщение
#4
|
Прогрессор Группа: Пользователи Сообщений: 602 Пол: Мужской Реальное имя: Михаил Репутация: 9 |
А сама последовательность и не нужна - у нас есть закон, полностью определяющий её построение!
По-научному иожно бы было сказать, что перед нами - программирование на основе инварианта. (Очень хорошая вещь... в частности, многие рекурсивные вычисления(или даже любые?) можно очень хорошо оптимизировать по времени, переделав её на итерацию, если найден подходящий инвариант, - что само по себе бывает очень сложно). Конечно, xds мог поступить иначе - за минутку написать рекурсивную процедуру, строящую последовательность, а потом просто выдающую запрошенный символ по номеру. Это выглядело бы просто и наглядно... и даже удобно для малых номеров... но вот для достаточно больших...уу-у |
APAL |
Сообщение
#5
|
Смотрю... Группа: Пользователи Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: 6 |
Оригинально!
Надеюсь автору топику подойдет такой вариант решения... xds, поощраю! -------------------- |
Tauka |
Сообщение
#6
|
Новичок Группа: Пользователи Сообщений: 28 Репутация: 0 |
Спасибо за ответ!Сейчас буду разбираться. Я в самом деле делала так: пыталась построить последовательность, а потом по номеру определять какой же это элемент, проблема состояла в том, что при больших n ничего не получалось.
-------------------- С уважением,
Таука. |
Текстовая версия | 23.12.2024 20:45 |