XmX

Calcolatrice con numeri romani, tipo XX - IX = XI

« Older   Newer »
  Share  
gigio^ne
view post Posted on 10/12/2010, 00:40 by: gigio^ne
Avatar

Advanced Member

Group:
Member
Posts:
1,184
Location:
Sedna

Status:


Arieccomi!!!! :alienff: :alienff: :ph34r:

Come funziona la funzione, O_o forse suona meglio come funza la funzione dei numeri romani. :B):
Il tutto si basa su 3 parametri principali.
1) - Operare sul numero immesso ricavandone il resto (operazione MOD) numero da convertire.
2) - Trasformare in un intero (senza decimali) prossimo numero da convertire.
3) - con i 2 parametri sopra eseguire un loop per la cnversione in numero romano.

Non sono mai stato bravo a spiegarmi, forse un'esempio rende meglio l'idea.

Esempio pratico:

Numero da convertire -> Num = 253
Estraggo il resto con MOD da Num -> 253 mod 10 = 3
Trasformo in un'intero e divido per 10 il prossimo numero da convertire 253 -> 253 \ 10 = 25

A questo punto abbiamo 3 e 25, dove 3 è il primo numero da convertire e 25 il prossimo da estrapolare.

Infatti dopo il primo loop si avrà il 3 trasformato in III
e si procede come sopra:

Numero da convertire -> Num = 25
Estraggo il resto con MOD da Num -> 25 mod 10 = 5
Trasformo in un'intero e divido per 10 il prossimo numero da convertire 25 -> 25 \ 10 = 2

E la storia si ripete.
Abbiamo 5 e 2, dove 5 è il secondo numero da convertire e 2 il prossimo da estrapolare.

dopo il secondo loop si avrà il 5 trasformato in L + III -> LIII

Per concludere.
Numero da convertire -> Num = 2
Estraggo il resto con MOD da Num -> 2 mod 10 = 2
Trasformo in un'intero e divido per 10 il prossimo numero da convertire 2 -> 2 \ 10 = 0 Esce dal Loop.

dopo il terzo loop si avrà il 2 trasformato in CC + L + III -> LIII -> CCLIII Alias 253

Perchè il 5 è diventato 50 e il 2 è ora 200, semplicemente per i tre passaggi
il primo era 3 = III, il secondo era 5 + 0 = L (secondo loop) il terzo era 2 + 0 + 0 = CC (terzo loop)

Spero di essere stato chiaro, cosa rara... :lol:

Ecco il listato in Python.
CODICE
#*** RomanCalc.py scritta con Pyton ver. 2.7 per windows 64bit
#*** programma testato unicamente su win seven 64bit.
#*** Funzione che trasforma numeri decimali in numeri romani
#*** Questa però presenta un limite numerico massimo che è 3999
#*** Numeri superiori non possono essere convertiti in quanto
#*** la numerazione romana comprende cifre fino alle migliaia simbolo (M)
#*** cifre superiori per poterle sommare, sotrarre, moltiplicarle etc.
#*** necessitano di caratteri non compresi nei 255 codici ASCII
#*** ATTENZIONE: oltre il 3999 il programma da i numeri nel vero senso
#*** della parola, es. digitate 5656 e vi esce XX.
import sys    #*** header di programma.
#*** Funzione di conversione
def ConvertNum(Num):
   dgt = "IVXLCDM"       #*** Costante dei numeri romani.
   x = 0
   t = ""
   while Num > 0:       #*** esegue un ciclo fino a che il numero delle cifre è finito
       dg = Num % 10    #*** trova il resto della divisione num / 10, o meglio è la funzione MOD di python
       Num = int(Num / 10) #*** divide e trasforma Num in un'intero
       #*** Procedura per la conversione in numero romano.
       if dg == 1:
           t = dgt[x:x+1] + t
       elif dg == 2:
           t = dgt[x:x+1] + dgt[x:x+1] + t
       elif dg == 3:
           t = dgt[x:x+1] + dgt[x:x+1] + dgt[x:x+1] + t
       elif dg == 4:
           t = dgt[x:x+2] + t
       elif dg == 5:
           t = dgt[x + 1:x+2] + t
       elif dg == 6:
           t = dgt[x + 1:x+2] + dgt[x:x+1] + t
       elif dg == 7:
           t = dgt[x + 1:x+2] + dgt[x:x+1] + dgt[x:x+1] + t
       elif dg == 8:
           t = dgt[x + 1:x+2] + dgt[x:x+1] + dgt[x:x+1] + dgt[x:x+1] + t
       elif dg == 9:
           t = dgt[x:x+1] + dgt[x + 2:x+3] + t
       x += 2
   return t
# Programma principale, esegue un ciclo infinito richiamando se stesso fino a che non viene
# immesso (0) o si preme invio senza alcun numero. Procedura errori non implementata.
while 1:
   Num = input("Inserire un numero decimale inferiore a 4000 (0) per uscire: ")
   if Num == 0:
       break
   print "numero romano = ",ConvertNum(Num)   # Stampa il numero romano.
 
Top
20 replies since 6/12/2010, 21:08   8215 views
  Share