''' Scrivere una funzione convertiNumero(N) che riceve come input un numero intero e torna come risultato una stringa che lo rappresenta come sequenza di numeri seguiti dai moltiplicatori per potenze di 1000: G: giga (1000^3) M: mega (1000^2) K: kilo (1000^1) U: unita(1000^0) Esempi: convertiNumero(2003004005) -> '2G 3M 4K 5U' convertiNumero(5) -> '0G 0M 0K 5U' convertiNumero(123000000000)-> '123G 0M 0K 0U' ''' # per convertire il numero si possono sfruttare i due operatori sugli interi: # // divisione intera # % resto della divisione intera # e ripetutamente estrarre dal numero i resti della divisione per 1000 # Quindi lo pseudocodice di un possibile algoritmo potrebbe essere: # Input: un numero intero positivo # Output: una stringa come descritto sopra # Algoritmo: # estrarre le unita # eliminare dal numero le unita' # estrarre le migliaia # eliminare dal numero le migliaia # ... continuare cosi' con mega e giga # costruire la stringa del risultato convertendo i numeri ottenuti in stringhe e concatenandole con le lettere # tornare il risultato # Esempio di implementazione def convertiNumero(N): unita = N % 1000 N = N // 1000 kilo = N % 1000 N = N // 1000 mega = N % 1000 N = N // 1000 giga = N % 1000 return str(giga) + 'G ' + str(mega) + 'M ' + str(kilo) + 'K ' + str(unita) + 'U' print('Esempi:') print(convertiNumero(2003004005), "atteso: '2G 3M 4K 5U'") print(convertiNumero(5), "atteso: '0G 0M 0K 5U'") print(convertiNumero(123000000000), "atteso: '123G 0M 0K 0U'") ############################################################################### ''' Modificare la funzione in modo che vengano stampati i numeri seguiti dalla lettera solo se il valore e' diverso da 0 ''' # In questo caso possiamo costruire la stringa risultato un pezzo per volta, # aggiungendo un frammento solo se il numero corrispondente e' diverso da 0 # NOTA: in python, un valore usato come condizione di un test ha il valore 'False' se e': # zero 0 # stringa vuota '' # quindi scrivere 'if giga:' e' lo stesso che scrivere "se il valore giga e' diverso da 0" def convertiNumero2(N): unita = N % 1000 N = N // 1000 kilo = N % 1000 N = N // 1000 mega = N % 1000 N = N // 1000 giga = N % 1000 risultato = '' if giga: risultato += str(giga) + 'G ' if mega: risultato += str(mega) + 'M ' if kilo: risultato += str(kilo) + 'K ' if unita: risultato += str(unita) + 'U' return risultato print('Esempi2:') print(convertiNumero2(2003004005), "atteso: '2G 3M 4K 5U'") print(convertiNumero2(5), "atteso: '5U'") print(convertiNumero2(123000000000), "atteso: '123G '") # NOTA: se mancano le unita' la stringa termina per spazio ############################################################################### ''' Modificare la funzione per evitare di inserire spazi in fondo ''' # Una possibile soluzione potrebbe sfruttare la il metodo 'join' delle stringhe, # che concatena una lista di valori inserendo un separatore solo tra gli elementi # Quindi l'algoritmo va modificato in modo che: # 1) invece di concatenare le stringhe le raccogliamo in una lista # 2) quando costruiamo ciascun elemento NON mettiamo lo spazio def convertiNumero3(N): unita = N % 1000 N = N // 1000 kilo = N % 1000 N = N // 1000 mega = N % 1000 N = N // 1000 giga = N % 1000 risultato = [] if giga: risultato += [ str(giga) + 'G' ] if mega: risultato += [ str(mega) + 'M' ] if kilo: risultato += [ str(kilo) + 'K' ] if unita: risultato += [ str(unita) + 'U' ] return ' '.join(risultato) print('Esempi3:') print(convertiNumero3(2003004005), "atteso: '2G 3M 4K 5U'") print(convertiNumero3(5), "atteso: '5U'") print(convertiNumero3(123000000000), "atteso: '123G'")