2011-02-03 14 views
6

Cześć Mam stara się to problem:Podsumowując cyfry!

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.

Oto mój python code który daje jako odpowiedź, ale sędzia nie wydaje się zgodzić na to:

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) 

Czy ktoś mógłby mi powiedzieć, co jest złego w moim podejściu? Byłbym wdzięczny, gdyby ktoś wskazał mi matematyczne rozwiązanie tego samego.

+1

@Tretwick Marian: Dlaczego nie przyniesiesz tutaj kodu, a także opisz problem. Kiedy oba linki znikną. Ten wpis stanie się nieistotny. – pyfunc

+0

Dodano opis problemu i kod. –

+0

Czy próbowałeś drukować P (15)? Co powiesz na P (1000) lub P (10000)? –

Odpowiedz

9

Po wyświetleniu komentarzy zauważyłbyś, że właściciele witryny lub problem mai ntainer, to kretyn.

Chciał powiedzieć od "0 do 10000", a nie "od 1 do 10000", ale najwyraźniej problem nie może być edytowany, lub opiekun nie chce tego zrobić.

Suma jest wyłączona o 1, ponieważ 1<<0 wynosi 1, co dodaje 1 do sumy.

prześlij 67783432.

Uwaga: Zdaję sobie sprawę, że wywołanie właścicieli witryn lub opiekuna kretyn może wydawać surowe, ale podczas publikowania treści na stronie o „Matematyka”, dokładność jest dosyć ważne. Posiadanie takiej strony bez umiejętności lub wymagań, aby naprawić niewłaściwe problemy, wydaje mi się głupie.

+0

@Lasse V. Karlsen: Dziękuję. – Quixotic

+0

Najprostszym rozwiązaniem na SO! Po prostu dodaj 1! – Benjamin

+1

Tak, to było naprawdę to. Zarejestrowałem się, zalogowałem, przeczytałem komentarze, wysłałem sumę + 1, odpowiedź została przyjęta. –

0

Twoje rozwiązanie zajmuje trochę czasu (w każdym razie ponad minutę). Czy narzucony przez sędziego limit czasowy może zająć rozwiązanie?

Ponadto, jeśli używasz Pythona 3, operator podziału (/=) zawsze tworzy wynik zmiennoprzecinkowy. W Pythonie 2 wynik zostanie obcięty do liczby całkowitej z wejściami całkowitymi.

Właściwie z Pythonie 3 pojawia się błąd przepełnienia:

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

Nie chciałeś użyć komentarza do tego tak jak reszta z nas;)? – Benjamin

+0

Używam Pyth 2.6 i nie ma limitu czasu, ponieważ tylko odpowiedź musi zostać przesłana. – Quixotic

+0

Nie wiem wtedy. Twój algorytm wydaje się być poprawny. –

0

Oto alternatywna implementacja że potwierdza swoją odpowiedź jest poprawna:

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

lub taki, który 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

Lub unikanie zmniejszenia: suma (suma (int (c) dla c w str (2 ** n)) dla n w zakresie (1, 10001)) – DSM

+0

@Tretwick, użyłem podobnej metody i otrzymałem tę samą odpowiedź. Albo czegoś brakuje, albo sędzia ma złą odpowiedź. – dheerosaur

+0

Jestem bardzo nowy w pyth i nie rozumiem tego fragmentu kodu:/ – Quixotic

3

Bardziej eleganckie rozwiązanie w zakresie programowania funkcyjnego może być:

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

(Zauważ ten oblicza sumę P (i) dla i = 0 do 10000)

0

Właściwie od Java nie mogę produkować tak dużych liczb (chyba że używasz klasy BigInteger - której nigdy nie używałem), tym lepiej, jeśli używasz elastycznych języków, takich jak Python

Python dał mi 2 ** 1000.Jest to bardzo duża liczba, którego rozwiązanie jest

spróbować tego w Pythonie

a = 2 ** 1000 print (a)

następnie wyjście z pytona jako ciąg i wziąć sumę każda cyfra

Powiązane problemy