1. 程式人生 > >FCC--Roman Numeral Converter(羅馬數字的轉換)

FCC--Roman Numeral Converter(羅馬數字的轉換)

將給定的數字轉換成羅馬數字。

演算法思路:1,將數字的每一位數字提出

                 2,根據數字的位置和值賦予相對的羅馬數字

                 3,將獲得的羅馬數字進行拼接

function convert(num) {
  var sig = 0,ten = 0,hundred = 0,thousand = 0;
  var str = '';
  sig = num % 10;
  if(num >= 10)  ten = Math.floor(num / 10 % 10);
  if(num >= 100)  hundred = Math.floor(num / 100 % 10);
  if(num >= 1000)  thousand = Math.floor(num / 1000);
  var count = {
     thousand : thousand, hundred : hundred, ten: ten,sig : sig
  };console.log(count);
  for(var i in count){
       switch(i){
        case 'thousand': 
           str += jisuan('M',count[i]);
          break;
        case 'hundred': 
           str += jisuan('C',count[i]);
          break;
        case 'ten': 
           str += jisuan('X',count[i]);
          break;
        case 'sig': 
           str += jisuan('I',count[i]);
          break;
      }
  }
  
 return str;
}

function jisuan(str,num){
  if(num === 0) return '';
  if(str == 'M'){
    switch(num){      
      case 1: return 'M';
      case 2: return 'MM';
      case 3: return 'MMM';
      default:
        return '';
    }
  }
  if(str == 'C'){
    switch(num){      
      case 1: return 'C';
      case 2: return 'CC';
      case 3: return 'CCC';
      case 4: return 'CD';
      case 5: return 'D';
      case 6: return 'DC';
      case 7: return 'DCC';
      case 8: return 'DCCC';
      case 9: return 'CM';
      default:
        return '';
    }
  }
  if(str == 'X'){
    switch(num){     
      case 1: return 'X';
      case 2: return 'XX';
      case 3: return 'XXX';
      case 4: return 'XL';
      case 5: return 'L';
      case 6: return 'LX';
      case 7: return 'LXX';
      case 8: return 'LXXX';
      case 9: return 'XC';
      default:
        return '';
    }
  }
  if(str == 'I'){
    switch(num){     
      case 1: return 'I';
      case 2: return 'II';
      case 3: return 'III';
      case 4: return 'IV';
      case 5: return 'V';
      case 6: return 'VI';
      case 7: return 'VII';
      case 8: return 'VIII';
      case 9: return 'IX';
      default:
        return '';
    }
  }
}

convert(100);

-----------------------------------------------------------------------------------------------------------------------------------------------------

看到一個非常好的思路,是將1,10,40,50等等分割數輸入到一個數組中,用另一個數組記錄相對應的羅馬字元。

從最大的數字開始遍歷,如果num大於當前數,則減去當前數,繼續進入迴圈。字串則加上對應的羅馬字元。

function convert(num) {
    var numArr = [1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000];
    var strArr = ["I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"];
    var result = "";
    while (num > 0) {
        var i = numArr.length;
        while (i >= 0) {
            if (num >= numArr[i]) {
                result += strArr[i];
                num -= numArr[i];
            } else {
                i--;
            }
        }
    }
    return result;
}
convert(100);

這個解法是目前發現最簡單的。