zinkinru
@zinkinru
Делаю красивый веб функциональным

Можно ли из заданных цифр составить последовательность чисел, являющуюся арифметической прогрессией?

Задана строка, состоящая из цифр. Длина строки не превышает 15 символов.

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

Входные данные: последовательность цифр.
51791

Выходные данные: искомая последовательность чисел (не менее трёх), записанных через пробел, либо 0, если последовательность составить не удалось.
5 7 9 11
  • Вопрос задан
  • 678 просмотров
Пригласить эксперта
Ответы на вопрос 3
sergiks
@sergiks Куратор тега Алгоритмы
♬♬
Можно всегда

В любом случае, при любых цифрах, числом более одной, можно составить «последовательность» всего из двух чисел и объявить её арифметической % )

51791
5,  5 + 1786 = 1791, третьим было бы 3577


Если серьёзно, разбейте на подзадачи.

Вот, дан набор чисел. Как быстро понять, является ли он арифм. последовательностью?
Наверное, это должен быть набор из 3 и более чисел. Отсортировать по возрастанию, получить разницу между 0-м и 1-м. Двигаться далее, сравнить 2й и 1й. Как только разница отличится от первой, это fail. Если успешно дошли до конца массива и везде разница одна и та же — это успех, это арфим. последовательноть.

Другая подзадача: из набора цифр составить все возможные числа. Чисел должно получиться 3 и более. Во всех вариантах перестановок, но с учетом повторяющихся цифр в исходном наборе.

Можно добавить всяких оптимизаций. Например, проверять чётность.
В арифметической последовательности чётность либо постоянная, либо чередуется через раз. Чётное число оканчивается на чётную цифру. Поэтому если в исходном наборе есть всего одна нечетная цифра, либо её место не в конце числа, либо в последовательности всего три числа и эта цифра в конце среднего.
Ответ написан
longclaps
@longclaps
'012' 0 1 2
'0123' 0 1 2 3
'01234' 0 1 2 3 4
'012345' 0 1 2 3 4 5
'0123456' 0 1 2 3 4 5 6
'01234567' 0 1 2 3 4 5 6 7
'012345678' 0 1 2 3 4 5 6 7 8
'0123456789' 0 1 2 3 4 5 6 7 8 9
'01234567890' 0 18 36 54 72 90
'012345678901' 0 1 2 3 4 5 6 7 8 9 10
'0123456789012' 56 94 132 170 208
'01234567890123' 57 120 183 246 309
'012345678901234' 100 312 524 736 948
'0123456789012345' 0 181 362 543 724 905
'01234567890123456' 58 179 300 421 542 663
'012345678901234567' 50 1736 3422 5108 6794
'0123456789012345678' 6 139 272 405 538 671 804
'01234567890123456789' 0 9 18 27 36 45 54 63 72 81 90
'012345678901234567890' 162 300 438 576 714 852 990
'0123456789012345678901' 28 37 46 55 64 73 82 91 100 109
'01234567890123456789012' 584 1007 1430 1853 2276 2699
'012345678901234567890123' 102 219 336 453 570 687 804 921
'0123456789012345678901234' 91 674 1257 1840 2423 3006 3589
'01234567890123456789012345' 105 984 1863 2742 3621 4500 5379
'012345678901234567890123456' 162 1300 2438 3576 4714 5852 6990
'0123456789012345678901234567' 1621 3002 4383 5764 7145 8526 9907
'01234567890123456789012345678' 72 163 254 345 436 527 618 709 800 891
'012345678901234567890123456789' 108 197 286 375 464 553 642 731 820 909
Написать можно, но на плохих данных ей поплохеет.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Дано:
Строка цифр: 51791

Ограничения:
Минимальное количество элементов на выходе: 3

Эвристика:
Максимальное значение элемента: 975
Максимальное кол-во цифр в одном выходном элементе: 3
PS: Можно также, дополнительно, применить эвристику расчёта количества возможных разрядов в комбинациях, но это уже чуть сложнее.

1: 517, 9, 1 => 517-9=9-1 ? => false
2: 517, 1, 9 => 517-1=1-9 ? => false
3: 171, 5, 9 => ... => false
... и т.д.,
делаем сначала склейки, начиная с максимально возможных значений, затем сдвиг/перестановку одной цифры (и снова склейки), не превышая максимального числа цифр (в данном случае: 3) в одном тестируемом значении.
На каждом шаге проверяем равное расстояние.
Как только подобрали одно - оставляем эти цифры и проверяем оставшиеся ("погружение").
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы