JavaScript
// Problema 1
function romanizar(n){
var values = [1, 5, 10, 50, 100, 500, 1000], letras = ['I', 'V', 'X', 'L', 'C', 'D', 'M'];
var res = [];
var num, letra;
for(var i = 6; num = values[i], letra = letras[i]; i--){
if(n / num >= 1){ // Suficientemente grande
var r = ~~(n / num); // Número de letras repetidas
n -= r * num; // Restamos
if(r < 4){ // Normal
while(r--){ res.push(letra); } // Metemos las letras
} else { // No se pueden repetir 4+ veces
var val = res.pop(); // Última letra
var pos = (val ? letras.indexOf(val) : i) + 1; // Si es el string vacío o letra == "M" (no hay anterior) usamos la letra anterior a esta
var insert = letra + (letras[pos] || 'M'); // Y si letra == "M" -> letras[pos] no existirá y usamos M a pelo
res.push(insert); // Insertamos el string
}
} else { // Si no vamos a poner letra usamos un "" para que no afecte pop
res.push('');
}
}
return res.join('');
}
var ns = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 69, 450, 666, 999, 1444, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016];
ns.forEach(function(act){ document.write(act + ' : ' + romanizar(act) + '<br />'); });