1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| var A = [ 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 ],
R = [ "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" ],
Alength = A.length;
// conversion d'un entier en nombre romain
function AtoR( nb ){
// on s'assure d'avoir un entier entre 1 et 3999.
var x = parseInt( nb, 10 ) || 1,
str = "";
if ( x < 1 ){
x = 1;
} else if ( x > 3999 ){
x = 3999;
}
// pour chaque A[ i ],
// tant que x est supérieur ou égal
// on déduit A[ i ] de x.
// arrêt de la boucle si x == 0
for ( var i = 0; i < Alength; ++i ){
while ( x >= A[ i ] ){
x -= A[ i ];
str += R[ i ];
}
if ( x == 0 ){
break;
}
}
return str;
}
// conversion d'un nombre romain en entier
function RtoA( str ){
// on s'assure d'avoir un texte ayant au moins un caractère.
if ( ( typeof str != "string" ) || ( str.length < 1 ) ) return;
var x = 0,
item = "";
// pour chaque R[ i ],
// si R[ i ] est égal à item
// on ajoute A[ i ] à x
// et on enlève item de str.
for ( var i = 0; i < Alength; ++i ){
while ( str.length >= R[ i ].length ){
item = str.slice( 0, R[ i ].length );
if ( R[ i ] == item ){
x += A[ i ];
str = str.substring( R[ i ].length );
} else {
break;
}
}
}
return x;
}
/* Test */
var str = "",
x = 0,
tab = [];
for ( var n = 1; n < 4000; n++ ){
str = AtoR( n );
x = RtoA( str );
tab.push( [ n, str, x ] );
}
console.log( tab ); |
Partager