
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
15.09.2011, 17:32
|
|||
|---|---|---|---|
|
|||
Нужен алгоритм. Конвертация диапазона чисел в шаблон с переменными |
|||
|
#18+
Дано 2 целых числа. Число А - начальное Число Б - конечное Число А < или = Б Количество символов в числе А = количеству символов в числе Б. Даже если А=0 (пример: число А=00, число Б=99; или А=001, Б=056 - это всё часть результата). Данный диапазон - непрерывен. Циклически прибавляя +1, мы достигнем число Б, начиная с числа А (если только А!=Б). Тогда и прибавлять нечего. И результат - 1 строка. Задача: расписать данный диапазон от А до Б с минимальным количеством строк, подставляя переменную X, которая может быть равна любому значению от 0 до 9, в качестве любой цифры/символа из данного диапазона. Примеры. Дано. А=000, Б=021 Результат (4 строки): 00X 01X 020 021 Дано. А=019. Б=301 Результат (11 строк): 019 02Х 03Х 04Х 05Х 06Х 07Х 08Х 09Х 2ХХ 301 Возможен ли универсальный алгоритм по данную задачу? Заранее спасибо. Любые советы будут полезны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.09.2011, 20:48
|
|||
|---|---|---|---|
Нужен алгоритм. Конвертация диапазона чисел в шаблон с переменными |
|||
|
#18+
Обычный алгоритм двунаправленного укрупнения диапазонов. Посмотрите стандартную задачу представления диапазона IP-адресов в виде минимального набора подсетей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.09.2011, 21:12
|
|||
|---|---|---|---|
|
|||
Нужен алгоритм. Конвертация диапазона чисел в шаблон с переменными |
|||
|
#18+
Непрограммист, В программировании нельзя отличить числа 0036 и 36. Стало быть, мы имеем дело со строками, судя по примерам (к слову, второй пример решён неверно). Далее. У нас есть строковые записи А и Б, равной длины и состоящие из символов 0-9. Описание "диапазона" несложно получить следующим образом (до этого вполне можно было бы додуматься, расписав руками ещё пару-тройку примеров): Пусть А и Б начинают (считая слева) различаться в некоторой цифре. Очевидно, что все цифры левее тупо повторятся во всех записях, так что будем считать, не ограничивая общности, что они различаются в первой слева цифре либо равны; второй случай тривиален. Если первая цифра А - а1, а Б - б1, то промежуток содержит все числа, начинающиеся с цифр между а1 и б1 (будем рассматривать А=0350, Б=3300. Тогда промежуток включает 1ХХХ и 2ХХХ). Выписали ли мы весь промежуток? Разумеется, нет - он пока не включает ни А, ни Б. Начнём расширять его в сторону А: остаток промежутка начинается с а1; если вторая цифра А - а2, то в него попадает всё, у чего вторая цифра больше а2 (в нашем примере, в промежуток добавились 04ХХ, 05ХХ, 06ХХ, 07ХХ, 08ХХ и 09ХХ). Неохваченный остаток промежутка со стороны А теперь начинается с а1,а2 и мы можем перейти к следующей цифре (036Х, 037Х, 038Х, 039Х). И так далее, пока не кончится число (в нашем случае, остался один шаг - 0351, 0352, 0353, 0354, 0355, 0356, 0357, 0358, 0359). Наконец, дополним его самим А (0350) и половина списка готова. Аналогично можно поступить со стороны Б, только на сей раз нас будут интересовать цифры меньше бi (30ХХ, 31ХХ, 32ХХ, 3300). Как видим, в случае цифр 9 в А или 0 в Б соответствующий шаг надо пропускать. Легко видеть, что последние десять элементов, дописанные со стороны А, можно было бы объединить в один. Как это можно сделать? Например, с помощью предварительной подготовки строк. После того, как мы определили первую различающуюся цифру, можно идя от правого края, заменять в А 0, а в Б 9 на Х (в нашем примере, такая подготовка даст А=035Х, Б=3300). Можно вместо этого поставить в А запись числа на 1 меньше, а в Б - на 1 больше и не включать края (проведите самостоятельно описанный вначале алгоритм для строк 0349, 3301). Всегда ли мы будем получать таким образом минимальное количество строк? Увы, нет: для А=01, Б=98 такой метод даст 26 строк, в то время как можно обойтись шестнадцатью (подумайте, как). Шагнём с противоположного конца: вот у нас есть строка, в которой на некоторой позиции стоит Х. Что это значит? Что при любой цифре на месте Х мы не выйдем за пределы диапазона от А до Б. Возьмём две любые цифры - 0 и 9. До тех пор, пока, идя слева направо, мы не натолкнулись на "вилку" аi=0, бi=9, мы можем пользоваться вышеописанным алгоритмом: никакое "конкурирующее" покрытие не сможет охватить одной строкой пару чисел, относящихся к разным нашим строкам. А вот 0-9, это и впрямь "вилка": можно попытаться подставить здесь Х, а можно поступить вышеописанным образом. В принципе, при недлинных строках можно рассчитывать оба варианта и смотреть, какой получился лучше. Дальше пока не придумал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.09.2011, 21:16
|
|||
|---|---|---|---|
|
|||
Нужен алгоритм. Конвертация диапазона чисел в шаблон с переменными |
|||
|
#18+
Да, во втором примере я забыл про строку "300". Щас попытаюсь переварить вами сказанное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.09.2011, 21:18
|
|||
|---|---|---|---|
|
|||
Нужен алгоритм. Конвертация диапазона чисел в шаблон с переменными |
|||
|
#18+
А, да, и вторую сотню в корне неправильно указал (2ХХ, а 1 уже надо было расписать). Да, виноват. На скорую руку примеры писал. Извините. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.09.2011, 09:10
|
|||
|---|---|---|---|
Нужен алгоритм. Конвертация диапазона чисел в шаблон с переменными |
|||
|
#18+
AbstractionВ программировании нельзя отличить числа 0036 и 36. Стало быть, мы имеем дело со строками, судя по примерамВообще-то из описания совершенно ясно, что требуется шаблонизация строкового представления чисел, выполненного в заданном формате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.09.2011, 10:11
|
|||
|---|---|---|---|
|
|||
Нужен алгоритм. Конвертация диапазона чисел в шаблон с переменными |
|||
|
#18+
Akina, Да, я понимаю. Хотелось отдельно обратить внимание, что на вход программе приходят строки, а не двоичные представления чисел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=16&tablet=1&tid=1342730]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
184ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 520ms |

| 0 / 0 |
