imho.ws |
![]() |
![]() |
![]() |
# 101 |
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
EvroStandart
Попробовал твой алгоритм на числе 99. Должно получиться 120 (копи+паст + изменение пары чисел - я их подчеркнул): После цифры 10 в каждой десятке одно число выбрасываем. Значит: если нужна позиция 99, 1) из восьми десятков выкидываем по числу 2) имеем 107 (99+8) и до цифры 91 включительно всё проверено. 3) проверяем от 92 до 107 перебором, выкидываем 99, 100, 101 4) ответ: 110 (107+3) Не получается... ![]() lalexa100 Эээ... Опять-таки, можно пример? Скажем с числом 123 (№100). Или хотя бы формулы по-подробнее расписать и без ошибок (две скобки открываем - одну закрываем) И кстати, насчет "n1 = 10 0-9": последовательность состоит из положительных чисел, т.е. 0 в нее не входит.
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! Последний раз редактировалось Ghost; 16.03.2005 в 17:25. |
![]() |
![]() |
# 102 |
Junior Member
Регистрация: 04.12.2002
Адрес: Москва, Кузьминки
Сообщения: 53
![]() |
Насчет ошибок - я подал только идею, ее еще до ума довести нужно.
число 123 № 100 итак n1=10 - не катит n2=10+81=91 - не катит n3=91+91*8 > 100 катит значит 3 цифры ищем первую 100-91=9 100-199 9*8=72 > 9 катит - значит цифра 1 ищем вторую 100-109 = 8 (первая 1 вторая 0 третья 2-9) не катит 110-119 выпадает из рассмотрения (первая = второй) 120-129 = 8+8 катит вторая 2 ну а последняя цифра 9 - 8 = 1 из списка 0.2.3.4.5.6.7.8.9 первая
__________________
В программировании главное - это пиво Последний раз редактировалось lalexa100; 16.03.2005 в 17:39. |
![]() |
![]() |
# 103 |
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Гыхм... Я уже ухожу сегодня, появлюсь теперь не знаю когда. Так что выкладываю свое решение. В процессе решения мне на ум приходили оба предложенных решения (и еще парочка), но первое я сразу отмел из-за наличия перебора, второе - не сумел довести до ума, не хватило терпения (или соображалки).
Может мои рассуждения вам покажутся чересчур сложными, но решал задачу я именно так (на подобные выкладки меня натолкнули воспоминания о прочитанном от корки до корки "Искусстве программирования" Кнута). Итак. Для начала строим дерево следующего вида: корень (уровень №0) - некий пустой элемент, из него выходят девять ветвей к узлам 1, 2, ..., 8, 9 - уровень №1; из каждого эелемента 1-го уровня также выходят ветви т.о., чтобы путь к ним по узлам (цифрам в узлах) не содержал повторяющихся цифирей, например, из узла (1) 1-го уровня выходят ветви к узлам 0, 2, 3, ..., 8, 9. И т.д. - всего 10 уровней, что очевидно - не может существовать десятичное число с неповторяющимися цифрами длиной более 10. Т.о., при проходе сверху-вниз по этому дереву всегда получается "разноциферное" число. Само это дерево в программе не потребуется, и строить его не нужно будет. Важны некоторые характеристики уровней. А именно:
Далее, зная N (номер искомого числа), легко вычисляется K - количество разрядов в нем: сперва записываем в K единицу, а потом увеличиваем, пока S[K] < N. После этого я запоминал номера узлов каждого уровня (начиная с K-го и вверх), через которые нужно пройти, чтобы получить искомое. В результате получил массив A из K элементов. Теперь, зная номера узлов в каждом уровне, легко определить путь прохода дерева с одновременным формированием числа. Для этого я просматривал массив A в прямом порядке (от 1 до K) и находил номера цифр ((A[i] - 1) mod T[i]) из строки W (в начале, перед первым шагом = '123456789'), добавляя их к результирующей строке Z и удаляя из W. На первый взгляд все кажется громоздким, но на деле выходит достаточно коротенькая программка: Код:
uses crt; var i, k, n: longint; a, t, f, s: array [1..10] of longint; w, z: string; begin clrscr; write('n = '); readln(n); if (n > 9) then begin fillchar(t, sizeof(t), 0); t[1] := 9; fillchar(f, sizeof(f), 0); f[1] := t[1]; fillchar(s, sizeof(s), 0); s[1] := f[1]; for i := 2 to 10 do begin t[i] := 11 - i; f[i] := t[i] * f[pred(i)]; s[i] := f[i] + s[pred(i)]; end; if n > s[10] then z := 'no solutions' else begin k := 1; while s[k] < n do inc(k); fillchar(a, sizeof(a), 0); for i := k downto 1 do begin if i = k then a[i] := n - s[i - 1] else a[i] := succ(pred(a[i + 1]) div t[i + 1]); end; w := '123456789'; z := ''; for i := 1 to k do begin z := z + w[succ(pred(a[i]) mod t[i])]; delete(w, succ(pred(a[i]) mod t[i]), 1); if i = 1 then w := '0' + w; end; end; end else if n > 0 then str(n, z) else z := 'no solutions'; writeln('r = ', z); readkey; end.
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! Последний раз редактировалось Ghost; 18.03.2005 в 10:02. Причина: склероZzz... |
![]() |
![]() |
# 104 |
Guest
Сообщения: n/a
|
К вопросу о uninheritable class
Я бы лично тоже решил задачку с private конструктором, но как видно это не то что задумывалось. Конечно можно воспользоваться языковыми примочками типа final (PHP), sealed (C#), NonInheritable (VB), но я так думаю что уважаемый Фей-Мод Dimm ![]() Код:
class A1 { public: A1(){}; private: class A2 { public: A2(){}; }; }; ![]() |
![]() |
# 105 |
Newbie
Регистрация: 16.09.2003
Адрес: Россия Москва
Пол: Male
Сообщения: 15
![]() |
Дорогие форумчане, помогите решить такую простую задачу.
А то просто ум за разум заходит , арешения нет ... Нам дано несколько букв (любое количество , по порядку, и каждая только по одному разу) нужно выдать все возможные варианты перебора по позициям. Например: A,B,C. получаем A,C,B C,A,B C,B,A B,A,C B,C,A и так с любым количеством.
__________________
Никогда не сдаваться!!! |
![]() |
![]() |
# 106 |
::VIP::
Регистрация: 19.03.2004
Сообщения: 1 329
![]() ![]() ![]() ![]() |
stastan
Это называется перестановками. Смотри алгоритм и пример решения тут http://opensource.com.ua/contents/978546900444p.html |
![]() |
![]() |
# 107 |
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
stastan
Код:
uses crt; var s: string; procedure write_all (s, p: string); far; var i: integer; begin if length (p) = length (s) then writeln (p) else for i := 1 to length (s) do if pos (s[i], p) = 0 then write_all (s, p + s[i]); end; begin clrscr; write ('input string: '); readln (s); write_all (s, ''); write ('press any key to exit...'); readkey; end. ![]() ![]()
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! Последний раз редактировалось Ghost; 28.03.2006 в 16:52. |
![]() |
![]() |
# 109 |
Junior Member
Регистрация: 10.08.2004
Адрес: Завис в конторе
Пол: Male
Сообщения: 180
![]() ![]() ![]() ![]() ![]() ![]() |
to Crazy_kettle
Ту нет ничего удивительного. Внутри класса А1, А2 можно использовать как угодно. Попробуй так: Код:
class A1{...}; int main() { A1 *tmpA1 = new A1(); A2 *tmpA2 = new A2(); // вот так не выйдет ! }
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы! |
![]() |
![]() |
# 111 |
Junior Member
Регистрация: 10.08.2004
Адрес: Завис в конторе
Пол: Male
Сообщения: 180
![]() ![]() ![]() ![]() ![]() ![]() |
Google Code Jam Europe 2006
Началась регистрация участников конкурса Google Code Jam Europe 2006. Зарегиться можно всем желающим с Monday, May 1 по Tuesday, May 23. Само собой, будут призы. Код можно писать на Java, C++ или C#.
Подробности здесь PS: Если не туда закинул, поправьте. Просто, вроде как, это задачи для программеров. Можно здесь же и обсудить различные методы решения. PPS: Конкурс еще не начался, но различные задачи разного уровня сложности можно решать уже сейчас. Если не ошибаюсь, то за это начисляются балы. Вообщем, читаем правила, регистрируемся и пробуем выйти в призеры. Всем удачной игры ![]() Совсем вылетело из головы. Участие могут принимать All individuals who are legal residents of Europe, Africa and the Middle East may register and compete in the Google Code Jam Europe 2006 provided they physically reside in an eligible country from May 1 through June 29, 2006. В том числе и жители Росии.
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы! Последний раз редактировалось GOre01; 04.05.2006 в 11:33. Причина: добавил заголовок |
![]() |