2011-02-03 6 views
6

Привет я пытался из этого problem:Подведение итогов!

Suppose P(n) is sum of digits of 2^n
For example:
As 2^15 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26,so P(15)=26.
Catulate sum of the P(n) for n=1 to 10000.

Вот мой python code, который дает как ответ, но судья не кажется, согласны с этим:

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) 

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

+1

@Tretwick Marian: Почему бы вам не принести код здесь и не описать проблему. Когда обе ссылки уходят. Этот пост станет несущественным. – pyfunc

+0

Добавлено описание проблемы и код. –

+0

Вы пробовали печатать P (15)? Как насчет P (1000) или P (10000)? –

ответ

9

Если вы указали комментарии, вы бы заметили, что владельцы сайтов или проблема mai ntainer, является придурком.

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

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

Try подача 67783432.

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

+0

@ Lasse V. Karlsen: Спасибо. – Quixotic

+0

Самое простое решение на SO! Просто добавьте 1! – Benjamin

+1

Да, это действительно так. Я зарегистрировался, вошел в систему, прочитал комментарии, разместил сумму + 1, ответ принят. –

0

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

Также, если вы используете 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 
+5

Не хотел использовать для этого комментарий, как и все остальные;)? – Benjamin

+0

Я использую Pyth 2.6, и нет предела времени, так как должен быть отправлен только ответ. – Quixotic

+0

Тогда я не знаю. Ваш алгоритм кажется правильным. –

0

Вот альтернативная реализация, что подтверждает правильность вашего ответа:

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

Или один, что memoizes:

>> 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 
+3

Или избежать сокращения: sum (сумма (int (c) для c в str (2 ** n)) для n в диапазоне (1, 10001)) – DSM

+0

@Tretwick, я использовал аналогичный метод и получил тот же ответ. Либо мы чего-то упускаем, либо судья имеет неправильный ответ. – dheerosaur

+0

Я очень новичок в pyth, и я не понимаю эту часть кода:/ – Quixotic

3

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

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

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

0

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

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

попробовать это в питона

а = 2 ** 1000 печать (а)

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

Смежные вопросы