Как мы узнали из Святого Числа , есть 5 святых цифр ( 0, 4, 6, 8, 9
), и положительные целые числа, состоящие исключительно из этих цифр, являются святыми. Кроме того, святость числа - это сумма дыр в числе ( +2
для каждого 0
или 8
, и +1
иначе).
Теперь необходимо принять во внимание еще одно свойство, чтобы действительно и точно представлять святость числа. Видите ли, важно не только количество дырок в цифре, но и то, где в числе это происходит.
Рассмотрим число 88
. По нашим старым правилам это будет иметь святость 4
. Но это вряд ли справедливо! 8
Слева делает больше работы , чем другой 8
- в 10 раз больше работы! Должен быть вознагражден за свою работу. Мы вознаградим его дополнительными баллами святости, равными общей святости всех цифр справа от нее (включая дополнительные баллы святости, предоставленные этим правилом цифрам справа), минус 1.
Вот еще примеры, чтобы принять во внимание:
Number: 8080
Digital holiness: (2 + 7 - 1) + (2 + 3 - 1) + (2 + 1 - 1) + (2 + 0 - 1)
Total holiness: 15
Number: 68904
Digital holiness: (1 + 5 - 1) + (2 + 2 - 1) + (1 + 1 - 1) + (2 + 0 - 1) + (1 + 0 - 1)
Total holiness: 10
Все цифры соответственно вознаграждены за свою работу с дополнительной святостью, и все хорошо. Мы будем называть это свойство "повышенной целостностью".
В великолепном языке Python алгоритм для вычисления повышенной целостности может выглядеть примерно так:
# assumes n is a holy number
def enhanced_holarity(n):
if n < 10:
return 1 if n in [0, 8] else 0
else:
digits = list(map(int,str(n)[::-1]))
res = []
for i,x in enumerate(digits):
res.append(enhanced_holarity(x))
if i > 0:
res[i] += sum(res[:i])
return sum(res)
Соревнование
Получив целое число n > 0
, выведите первые n
святые числа, отсортированные по возрастанию расширенной целостности, используя числовое значение в качестве прерывателя связей. Вы можете предположить, что ввод и вывод будут не больше максимально представимого целого числа в вашем языке или в 2^64 - 1
зависимости от того, что меньше.
Для справки, вот несколько тестов (ввод, затем вывод):
25
4, 6, 9, 44, 46, 49, 64, 66, 69, 94, 96, 99, 0, 8, 84, 86, 89, 40, 48, 60, 68, 90, 98, 80, 88
100
4, 6, 9, 44, 46, 49, 64, 66, 69, 94, 96, 99, 444, 446, 449, 464, 466, 469, 494, 496, 499, 644, 646, 649, 664, 666, 669, 694, 696, 699, 0, 8, 84, 86, 89, 844, 846, 849, 864, 866, 869, 894, 896, 899, 40, 48, 60, 68, 90, 98, 404, 406, 409, 484, 486, 489, 604, 606, 609, 684, 686, 689, 80, 88, 804, 806, 809, 884, 886, 889, 440, 448, 460, 468, 490, 498, 640, 648, 660, 668, 690, 698, 840, 848, 860, 868, 890, 898, 400, 408, 480, 488, 600, 608, 680, 688, 800, 808, 880, 888
200
4, 6, 9, 44, 46, 49, 64, 66, 69, 94, 96, 99, 444, 446, 449, 464, 466, 469, 494, 496, 499, 644, 646, 649, 664, 666, 669, 694, 696, 699, 944, 946, 949, 964, 966, 969, 994, 996, 999, 4444, 4446, 4449, 4464, 4466, 4469, 4494, 4496, 4499, 4644, 4646, 4649, 4664, 4666, 4669, 4694, 4696, 4699, 0, 8, 84, 86, 89, 844, 846, 849, 864, 866, 869, 894, 896, 899, 40, 48, 60, 68, 90, 98, 404, 406, 409, 484, 486, 489, 604, 606, 609, 684, 686, 689, 904, 906, 909, 984, 986, 989, 4044, 4046, 4049, 4064, 4066, 4069, 4094, 4096, 4099, 80, 88, 804, 806, 809, 884, 886, 889, 440, 448, 460, 468, 490, 498, 640, 648, 660, 668, 690, 698, 940, 948, 960, 968, 990, 998, 4404, 4406, 4409, 4484, 4486, 4489, 4604, 4606, 4609, 4684, 4686, 4689, 840, 848, 860, 868, 890, 898, 400, 408, 480, 488, 600, 608, 680, 688, 900, 908, 980, 988, 4004, 4006, 4009, 4084, 4086, 4089, 800, 808, 880, 888, 4440, 4448, 4460, 4468, 4490, 4498, 4640, 4648, 4660, 4668, 4690, 4698, 4040, 4048, 4060, 4068, 4090, 4098, 4400, 4408, 4480, 4488, 4600, 4608, 4680, 4688, 4000, 4008, 4080, 4088
2^64 - 1
? Если это так, то, вероятно, стоит выяснить, какой вход сначала генерирует такие числа, чтобы люди могли проверить свои ответы.