Section courante

A propos

Section administrative du site

Il peut être amusant d'effectuer des calculs avec des chiffres romains, toutefois les calculs à la main nous semblent fastidieux ou on a l'impression d'avoir oublié quelque chose ! Pour résoudre le problème, créez-vous une calculatrice ! Il suffit simplement d'effectuer une conversion des nombres romains en nombre arabe et vice versa et de l'intégré à une calculatrice classique. Voici de quoi devrait avoir l'air la calculatrice :

Calculatrice romaine

A l'aide du code source JavaScript suivant, vous trouverez la réponse que vous souhaitez :

  1. <html><head>
  2. <script language="JavaScript" type="text/javascript">
  3. var eqFlg = false, lastBut = "+", lastOp = "+", newNum = true, Total = 0;   
  4.    
  5. function trim(chaine) {
  6.  return chaine.replace(/(^s*)|(s*$)/g,""); 
  7. }   
  8.    
  9. function RomainToNumber(num) {
  10.  var i = 0, n = 0;
  11.  
  12.  num = num.toUpperCase();     
  13.  // Calcul les milliers
  14.  while (num.charAt(i) == "M") n+=1000, i++;
  15.  
  16.  // Calcul les centaines
  17.  if(num.substr(i,2) == "CM") n+=900, i+=2; else 
  18.  if(num.substr(i,2) == "CD") n+=400, i+=2; 
  19.  else {
  20.   if(num.charAt(i) == "D") n+= 500, i++;       
  21.   while(num.charAt(i) == "C") n+=100, i++;
  22.  }
  23.  
  24.  // Calcul les dizaines
  25.  if(num.substr(i,2) == "XC") n+=90, i += 2; else 
  26.  if(num.substr(i,2) == "XL") n+=40, i += 2; 
  27.  else {
  28.   if(num.charAt(i) == "L") n+=50, i++;  
  29.   while (num.charAt(i) == "X") n+=10, i++;
  30.  }
  31.  
  32.  // Calcul les unités
  33.  if(num.substr(i,2) == "IX") n += 9, i+=2; else 
  34.  if(num.substr(i,2) == "IV") n += 4, i += 2; 
  35.  else {
  36.   if(num.charAt(i) == "V") n += 5, i++; 
  37.   while(num.charAt(i) == "I") n++, i++;
  38.  }
  39.  return(n);
  40. }
  41.    
  42. function NumberToRomain(X) {
  43.  S = "";
  44.  switch(parseInt((X % 10000) / 1000)) {
  45.   case 4: S+="MMMM";break;
  46.   case 3: S+="MMM";break;
  47.   case 2: S+="MM";break;
  48.   case 1: S+="M";break;
  49.  } 
  50.  switch(parseInt((X % 1000) / 100)) {
  51.   case 9: S+="CM";break;
  52.   case 8: S+="DCCC";break;
  53.   case 7: S+="DCC";break;
  54.   case 6: S+="DC";break;
  55.   case 5: S+="D";break;
  56.   case 4: S+="CD";break;
  57.   case 3: S+="CCC";break;
  58.   case 2: S+="CC";break;
  59.   case 1: S+="C";break;
  60.  }
  61.  switch(parseInt((X % 100) / 10)) {
  62.   case 9: S+="XC";break;
  63.   case 8: S+="LXXX";break;
  64.   case 7: S+="LXX";break;
  65.   case 6: S+="LX";break;
  66.   case 5: S+="L";break;
  67.   case 4: S+="XL";break;
  68.   case 3: S+="XXX";break;
  69.   case 2: S+="XX";break;
  70.   case 1: S+="X";break;
  71.  }
  72.  switch(X % 10) {
  73.   case 9: S+="IX";break;
  74.   case 8: S+="VIII";break;
  75.   case 7: S+="VII";break;
  76.   case 6: S+="VI";break;
  77.   case 5: S+="V";break;
  78.   case 4: S+="IV";break;
  79.   case 3: S+="III";break;
  80.   case 2: S+="II";break;
  81.   case 1: S+="I";break;
  82.  }
  83.  return S;
  84. } 
  85.  
  86. function ShowInput(n) {
  87.  document.forms[0].Resultat.value = " ".substr(n.length) + n;
  88. }
  89.  
  90. function EntNum(RomanNumber) {
  91.  eqFlg = false; lastBut = RomanNumber;
  92.  if(newNum) document.forms[0].elements[0].value = "", newNum = false;
  93.  ShowInput(trim(document.forms[0].elements[0].value + RomanNumber));
  94. }
  95.  
  96. function EntOperator(Operator) {
  97.  if(lastBut != "+" && lastBut != "-" && lastBut != "*" && lastBut != "/") {
  98.   var negFlg = false, n, Num = trim(document.forms[0].elements[0].value); 
  99.   if(Num.charAt(0) == "-") negFlg = true, Num = Num.substr(1);
  100.   if(Num != ".") {
  101.    n = RomainToNumber(Num);
  102.    if(negFlg) n = -n;
  103.    Total = Math.round(eval(Total + lastOp + n));
  104.    if(Total < -4999 || Total > 4999) Num = "Erreur de débordement de valeur"; else 
  105.    if(Total == 0) Num = "."; else 
  106.    if(Total < 0) Num = "-" + NumberToRomain(-Total);
  107.    else Num = NumberToRomain(Total);
  108.    ShowInput(Num);
  109.    newNum = true, eqFlg = false;
  110.   }
  111.  }
  112.  lastBut = Operator, lastOp = Operator;
  113. }
  114.  
  115. function ComputeTotal() {
  116.  var negFlg = false, n, Num;
  117.  if(eqFlg) Num = ".", eqFlg = false;
  118.  else {
  119.   Num = trim(document.forms[0].elements[0].value), eqFlg = true;
  120.   if(Num.charAt(0) == "-") negFlg = true, Num = Num.substr(1);
  121.   if(Num != ".") {
  122.    n = RomainToNumber(Num);
  123.    if(negFlg) n = -n;
  124.    Total = Math.round(eval(Total + lastOp + n));
  125.    if(Total < -4999 || Total > 4999) Num = "Erreur de débordement de capacité"; else 
  126.    if(Total == 0) Num = "."; else 
  127.    if(Total < 0) Num = "-" + NumberToRomain(-Total);
  128.    else Num = NumberToRomain(Total);
  129.   }
  130.   lastOp = "+", newNum = true, Total = 0;
  131.  }
  132.  ShowInput(Num); 
  133. }
  134. </script>
  135. <style type="text/css">
  136.    <!--
  137.     INPUT {
  138.        font-family: 'Courier New', monospace;       
  139.       font-weight: bold;
  140.      }
  141.   -->
  142. </style>
  143. </head>
  144. <body>
  145. <table border="1" cellpadding="1" cellspacing="0">
  146.  <tr>
  147.   <td>
  148.    <form>
  149.     <table align="center">
  150.      <tr>
  151.       <td colspan="4">Calculatrice romaine</td>
  152.      </tr>
  153.      <tr>
  154.       <td colspan="4"><input name=Resultat size="20" value=""></td>
  155.      </tr>
  156.      <tr>
  157.       <td><input type="button" value=" M " onclick="EntNum('M');"></td>
  158.       <td><input type="button" value=" D " onclick="EntNum('D');"></td>
  159.       <td><input type="button" value=" C " onclick="EntNum('C');"></td>
  160.       <td><input type="button" value=" + " onclick="EntOperator('+');"></td>
  161.      </tr>
  162.      <tr>
  163.       <td><input type="button" value=" L " onclick="EntNum('L');"></td>
  164.       <td><input type="button" value=" X " onclick="EntNum('X');"></td>
  165.       <td><input type="button" value=" V " onclick="EntNum('V');"></td>
  166.       <td><input type="button" value=" - " onclick="EntOperator('-');"></td>
  167.      </tr>
  168.      <tr>
  169.       <td><input type="button" value=" I " onclick="EntNum('I');"></td>
  170.       <td><input type="button" value=" ÷ " onclick="EntOperator('/');"></td>
  171.       <td><input type="button" value=" × " onclick="EntOperator('*');"></td>
  172.       <td><input type="button" value=" = " onclick="ComputeTotal();"></td>
  173.      </tr>
  174.     </table>
  175.    </form>
  176.   </td>
  177.  </tr>
  178. </table>
  179. </body>
  180. </html>


Dernière mise à jour : Dimanche, le 12 janvier 2014