Es. 10. 15/05
Da aptiva.
Silvia propone questa soluzione.
def numdigit(num): if abs(num)/10 == 0 : return 1 numApp = numdigit(num/10) + 1 return numApp if __name__=="__main__": num0 = input("inserisci un numero intero: ") print "Il numero di cifre decimali e': " + str(numdigit(num0))
Che funziona in Python2... ma non in Python3 (e non basta inserire int() per l'input o le parentesi della print, ... a proposito: ne mancava una). Infatti Python2 e Python3 hanno una differenza per l'operatore di divisione /. Per Python2 se si dividono due interi la divisione e' intera, per Python3 / restituisce sempre un reale. Quindi il primo commento e' di cambiare / con //:
def numdigit(num): if abs(num)//10 == 0 : return 1 numApp = numdigit(num//10) + 1 return numApp if __name__=="__main__": num0 = int(input("inserisci un numero intero: ")) print("Il numero di cifre decimali e': " + str(numdigit(num0)))
Questo funziona sia in Python2 cha in Python3.
Occorre far notare la gestione di alcuni casi particolari:
- lo zero: si poteva usare come caso base, se il numero e' 0 occorrono zero caratteri, ma sarebbe stato sbagliato. Avrebbe funzionato per tutti i numeri tranne lo zero stesso (che ha necessita' di un carattere per poter essere rappresentato).
- numeri negativi: non e' stato contato il carattere per il segno - ma c'e' stata la preoccupazione di gestire il caso dei numeri da -1 a -9 che per la regola della divisione intera divisi per 10 avrebbero dato -1 e quindi diversi da 0 (sarebbe saltato il caso base della ricorsione).
Ecco il codice ottimizzato (python3):
def numdigit(num): def rnumdigit(num): return 0 if num==0 else 1+rnumdigit(num//10) if num>0: return rnumdigit(num) else: return 1+rnumdigit(-num) # one char is for "-" sign or 0 if __name__=="__main__": num0 = int(input("inserisci un numero intero: ")) print("Il numero di cifre decimali e':",numdigit(num0))