Подводя итоги! - PullRequest
       19

Подводя итоги!

6 голосов
/ 03 февраля 2011

Привет, я пытался решить эту проблему :

Предположим, P (n) является суммой цифр 2 ^ n
Например:
Так как 2 ^ 15 = 32768 и сумма его цифр равна 3 + 2 + 7 + 6 + 8 = 26, поэтому P (15) = 26.
Расчетная сумма P (n) для n = 1 до 10000.

Вот мой код Python , который дает 67783431 в качестве ответа, но судья, похоже, не согласен с этим:

def P(n):
    n = int(1<<n)
    S = 0
    while n != 0:
        S += (n%10)
        n /= 10
    return S

Sum = 0
for i in range(1,10001):
    Sum += P(i)
else:
    print(Sum)

Может кто-нибудь сказать мне, что не так в моем подходе? Буду признателен, если кто-нибудь укажет мне на то же математическое решение.

Ответы [ 5 ]

9 голосов
/ 03 февраля 2011

Если бы вы показали комментарии, вы бы заметили, что владельцы сайта или сопровождающий проблемы - идиот.

Он хотел сказать от «0 до 10000», а не «от 1 до 10000», но, видимо, проблема не может быть отредактирована, или сопровождающий не хочет это делать.

Сумма отклонена на 1, поскольку 1<<0 равно 1, что добавляет 1 к сумме.

Попробуйте отправить 67783432.

Примечание : Я понимаю, что называть владельцев сайта или сопровождающего придурком может показаться грубым, но при размещении на сайте материалов о "Математике" точность очень важна. Мне кажется глупым иметь такой сайт без возможности или требования исправить неправильные проблемы.

3 голосов
/ 03 февраля 2011

Более элегантное решение с точки зрения функционального программирования может быть:

>>> P = lambda n: sum(map(int, str(1 << n)))
>>> sum(P(i) for i in xrange(10001))
67783432

(обратите внимание, что это вычисляет сумму P (i) для i = от 0 до 10000.)

0 голосов
/ 11 марта 2013

На самом деле, поскольку Java не может генерировать такие большие числа (если вы не используете класс BigInteger - который я никогда не использовал), лучше, если вы используете гибкие языки, такие как Python

Python дал мне 2 ** 1000.это очень большое число, решение которого 1366

попробуйте это на python

a = 2 ** 1000 print (a)

, затем возьмитевывести из питона в виде строки и взять сумму каждой цифры

0 голосов
/ 03 февраля 2011

Вот альтернативная реализация, которая подтверждает ваш ответ правильный:

>>> sum(reduce(lambda x, y: x + int(y), str(2**n), 0) for n in xrange(1, 10001))
67783431

Или тот, который запоминает:

>> reduce(lambda x, y: (sum(int(c) for c in str(x[1]*2)) + x[0], x[1]*2), xrange(0, 10000), (0,1))[0]
67783431
0 голосов
/ 03 февраля 2011

Ваше решение запускается довольно долго (во всяком случае, больше минуты).Есть ли ограничение времени, наложенное судьей на время, необходимое для выполнения решения?

Кроме того, если вы используете Python 3, то оператор деления (/=) всегда создает число с плавающей запятойрезультат.В Python 2 результат будет обрезан до целого числа с целочисленными входными данными.

На самом деле, с Python 3 я получаю ошибку переполнения:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 6, in P
OverflowError: int/int too large for a float
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...