Miliard silnia

0

Cześć, zacząłem się bawić w SPOJa i mam pewien problem:
http://pl.spoj.com/problems/FCTRL3/

ogólnie spoko ale jest haczyk "Opis każdego przypadku składa się z jednej linii, w której znajduje się jedna nieujemna liczba całkowita n (0 ≤ n ≤ 1 000 000 000)."

Funkcja rekurencyjna w przypadku tak ogromnych liczb wywala błąd, więc przesłanie rozwiązania na SPOJu kończy się błędem Non zero exit code (NZEC)
natomiast wrzucenie to w block TRY wywala na platformie błąd "niepoprawna odpowiedź"

t = int(input())

def silnia(x):
    if x <= 0:
        return 1
    elif x == 1:
        return 1
    else:
        try:
            return x * silnia(x-1)
        except:
            return

for i in range(t):
    value = str(silnia(int(input())))
    if len(value) > 1:
        print(value[len(value)-2], end=" ")
    else:
        print(0, end=" ")
    print(value[len(value)-1])

PS. można te cyfry dziesiątek i jedności wypisać w jakiś bardziej 'sexy' sposób?
Dziękuje z góry :)

3

Oczywiście, 10! = 3 628 800. te zera z końca już nigdy nie znikną.
Ty naprawdę chciałeś policzyć 1000 000 000!? Już 100 000! ma 456 574 cyfry i czas obliczeń mierzy się w minutach.
Twoja funkcja silnia jest błędna, wg tej funkcji silnia(-1) = 1, a silnia dla argumentów całkowitych, ujemnych jest nieokreślona.
Lepiej liczyć iteracyjnie (zakładam, że n>=0)

s = 1
i = 1
while i<=n:
   s*=i
   i+=1
0

Hah, rzeczywiście! Dziękuje ;)

0

Twoja funkcja silnia jest błędna, wg tej funkcji silnia(-1) = 1, a silnia dla argumentów całkowitych, ujemnych jest nieokreślona.

skoro jest nieokreślona to nazwijmy to UB a nie błędem :-P

1 użytkowników online, w tym zalogowanych: 0, gości: 1