Алгоритм Python Голомб

#python #algorithm

Вопрос:

введите описание изображения здесь

программа должна найти сумму(n)
G1 G2 G3 … Gn

Я написал программу на python. Это работает, когда я бегу. но если я отправлю программу на тестирование на сайте, 4 теста пройдут успешно, 5-й завершится неудачей

мой код:

 import math  n = int(input()) k = 0 result = 0  while n gt; 0:  k  = 1   num = (math.floor(k / 2)   1)  sum_of_nums = num * k   n -= num  result  = sum_of_nums  result  = n * k  print(int(result))  

первые 25 номеров: [1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, ...]

1 = (floor(k / 2) 1) * k k = 1
2 2 = (floor(k / 2) 1) * k k = 2
3 3 = (floor(k / 2) 1) * k k = 3
4 4 4 = (floor(k / 2) 1) * k k = 4
...

result = n * k . этот код удаляет из результата (n может быть

Комментарии:

1. Может быть , попробовать round() вместо того, чтобы просто int() , что всегда приведет к результату?

2. результат будет только плавающим с «.0». пример: «1043.0» или «19274.0». функция int удаляет только «.0».

3. Откуда это floor(k / 2) 1 берется? Это действительно верно для самых первых значений, но есть ли у вас доказательства того, что это верно для любого целочисленного значения? Кстати, питонический способ вычислить это-не использовать математику, а полагаться на целочисленное деление: k // 2 1

4. После второго взгляда floor(k / 2) 1 неверно начинать с k = 8: последовательность Голомба содержит только 4 последовательных значения 8.

5. k = 8 5 последовательных 8 значений

Ответ №1:

Вот простой итеративный способ генерации последовательности Голомба:

 n = 25 ns = [1] for i in range(n-1):  ns.append(1 ns[i 1-ns[ns[-1]-1]]) ns  

Выход:

 gt;gt;gt; ns [1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9]  gt;gt;gt; sum(ns) 140  

nb. Я думаю, что ваш пример неверен

Комментарии:

1. 0 lt; n lt; 10^9. для работы много-много секунд, если n = 10^9 . Мне нужно, чтобы функция работала в течение 1 секунды