«Начните с более простой проблемы». -Polya
просуммировать п-значные числа, которые состоят из цифр 4,5,6 только
Как Ю. Хао объясняет выше, есть 3**n
числа и их среднее по симметрии, например. 555555, поэтому сумма равна 3**n * (10**n-1)*5/9
. Но если вы этого не заметили, вот как вы могли бы решить проблему по-другому.
Проблема имеет рекурсивную конструкцию, поэтому давайте попробуем рекурсивное решение. Пусть g (n) - сумма всех 456-чисел ровно n цифр. Тогда мы имеем рекуррентное соотношение: (., Например, при п = 3, столбец сотни)
g(n) = (4+5+6)*10**(n-1)*3**(n-1) + 3*g(n-1)
Чтобы это увидеть, отделить первую цифру каждого числа в сумме. Это дает первый термин. Второй член представляет собой сумму оставшихся цифр, один счетчик g (n-1) для каждого префикса 4,5,6.
Если это по-прежнему неясно, выписывать п = 2 и сумму отдельных десятков из блоков:
g(2) = 44+45+46 + 54+55+56 + 64+65+66
= (40+50+60)*3 + 3*(4+5+6)
= (4+5+6)*10*3 + 3*g(n-1)
Круто. На этом этапе острый читатель может захотеть проверить формулу Ю Хао для g (n), которая удовлетворяет нашему рекуррентному соотношению.
Чтобы решить проблему OP, сумма всех 456-цифр от 4 до 666666 равна g(1) + g(2) + g(3) + g(4) + g(5) + g(6)
. В Python, с динамического программирования:
def sum456(n):
"""Find the sum of all numbers at most n digits which consist of 4,5,6 only"""
g = [0] * (n+1)
for i in range(1,n+1):
g[i] = 15*10**(i-1)*3**(i-1) + 3*g[i-1]
print(g) # show the array of partial solutions
return sum(g)
При п = 6
>>> sum456(6)
[0, 15, 495, 14985, 449955, 13499865, 404999595]
418964910
Edit: я отмечаю, что OP усеченный его сумму в 666554, так что не вписывается в общую картину.Это будет меньше за последние несколько терминов
>>> sum456(6) - (666555 + 666556 + 666564 + 666565 + 666566 + 666644 + 666645 + 666646 + 666654 + 666655 + 666656 + + 666664 + 666665 + 666666)
409632209
Немного поиска в Интернете делает это очень легко найти: https://en.wikipedia.org/wiki/Arithmetic_progression#Sum для деталей. И да, даже SO имеет [этот вопрос] (http://stackoverflow.com/questions/6925516/find-the-sum-of-given-interval) уже рассмотренный. Просто сделайте еще немного исследований в следующий раз. – Evert
@Evert: Я уверен, что связанный с вами вопрос не то же самое. – Dair
Можно ли написать демо в JavaScript, или вы предпочитаете использовать синтаксис C? –