Zadanie z silnią [początkujący]

0

Cześć. Jestem tutaj nowy. Niedawno zacząłem uczyć się pythona. Przerobiłem kurs z Codecademy, "Python dla każdego" Dawsona Michaela oraz dokumentację języka (właściwie to jestem już na samym końcu). W ramach treningu rozwiązuję zadania ze SPOJ. Mam problem w zadaniu z silnią (http://pl.spoj.com/problems/FCTRL3/). Kod wypróbowałem i działał poprawnie a tam ciągle dostaję informację o błędnym wyniku. Załączam mój kod:

import sys

def silnia(liczba):
     if liczba < 10:
         silnia = 1
         for i in range(2, liczba + 1):
             silnia = silnia * i
         jednosci = silnia % 10
         dziesiatki = int((silnia / 10) % 10)
     else:
         jednosci = 0
         dziesiatki = 0
 
     return "{} {}".format(dziesiatki, jednosci)
 
 ilosc = int(sys.stdin.readline())
 for temp in range(ilosc):
     liczba = int(sys.stdin.readline())
     sys.stdout.write(silnia(liczba))

Przeszukując internet znalazłem gotowe rozwiązanie (https://github.com/rombarte/SPOJ/blob/master/FCTRL3/source.py) ale ono też nie działa. Co robię źle? Proszę o pomoc

0
def silnia(liczba):
	if(liczba==1):
		return liczba
	else:
		return liczba * silnia(liczba-1)
ilosc = eval(input())

for temp in range(ilosc):
	liczba = eval(input())
	wynik = silnia(liczba)
	jednosci = wynik % 10
	dziesiatki = int(wynik / 10)
	print("{} {}".format(dziesiatki, jednosci))



0

żartowałem to jest źle

0

To chyba lepsze no ale nwm

def silnia(liczba):
	if(liczba<=1):
		return 1
	else:
		return liczba * silnia(liczba-1)
		
ilosc = eval(input())

for temp in range(ilosc):
	liczba = eval(input())
	if(liczba<10):
		wynik = silnia(liczba)
		jednosci = wynik % 10
		dziesiatki = int((wynik / 10)%10)
	else:
		jednosci = 0
		dziesiatki = 0
	print("{} {}".format(dziesiatki, jednosci))



1

Nie wiem czy Używasz pythona3, ale co się dzieje w tej linijce?
dziesiatki = int((silnia / 10) % 10)
W pythonie3 takie dzielenie zwraca float, a takie // - integera. Kod:

def last_fact_digits(n):
    if n > 11:
        return 0, 0
    d1 = fact(n) // 10 % 10
    d2 = fact(n) % 10
    return d1, d2


def fact(n):
    if n == 0:
        return 1
    mul = 1
    for k in range(1, n + 1):
        mul = (mul * k)
    return mul


def test():
    assert(last_fact_digits(0) == (0, 1))
    assert(last_fact_digits(2) == (0, 2))
    assert(last_fact_digits(1999999999900) == (0, 0))
    assert(last_fact_digits(199997777) == (0, 0))
test()

print("Test passed")

EDIT: W pythonie3, oczywiscie, zwraca integers.

1

Pomysł by liczyć silnie jest co najmniej dziwny. 10! = 3628800. Dla wszystkich kolejnych silni, dwie ostatnie cyfry są zerami.

0

Już wiem co robiłem źle. Zamiast:
return "{} {}".format(dziesiatki, jednosci)
Musi być:
return "{} {}\n".format(dziesiatki, jednosci)
I wtedy rozwiązanie jest poprawne bo program wypisuje każde rozwiązanie w osobnej linii.

lion137
Nie wiem czy Używasz pythona3, ale co się dzieje w tej linijce?
dziesiatki = int((silnia / 10) % 10)

W tej linijce program oblicza liczbę dziesiątek tak, aby np dla 5! nie wyszło 12 dziesiątek tylko 2. Faktycznie, zapomniałem o czymś takim jak // i zamieniałem zawsze na int. Teraz będę pamiętał. Dzięki :D

Dziękuję wszystkim za pomoc. Pozdrawiam :)

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