计算美女主播直播间密码
题目-破解直播间密码
美女主播的直播间密码是一串罗马数字,对应的阿拉伯数字是1414,转换成罗马数字就可以进去了。我们写个代码算一下对应的罗马数字,万一哪天美女美眉换了数字,我们能及时算出来。呵呵😑
数学知识
罗马数字的计数方法
基本字符 |
---|
相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
正常使用时,连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外);
在一个数的上面画一条横线,表示这个数扩大1000倍。
分析
元芳,来帮帮哥!怎么把阿拉伯数字转换成罗马数字呢?一个一个的加,来匹配么?
其实美眉主播出的题目具有迷惑性,所谓的罗马数字表示法可以类比下我们十进制的表示法,比如 123,就是1*100 + 2*10 + 3*1,就是包含1个100,3个10 ,1个1。我们把罗马数字的基数都表示出来,然后从大到小依次来找就好了。
Just Try
请你自动动手试一下:在线编程环境
想想有没有其他思路?
想想时间和空间复杂度,能否优化一下
真的做不到么?
let you think, think makes you happy!
参考答案
const RomanMap={
1000: "M",
900: "CM",
500: "D",
400: "CD",
100: "C",
90: "XC",
50: "L",
40: "XL",
10: "X",
9: "IX",
5: "V",
4: "IV",
1: "I"
}
function algorithm(n){
let baseKey = Object.keys(RomanMap)
let roman = [], cnt = 0;
baseKey.reverse().forEach(k=>{
cnt = n/k;
n = n%k;
for(;cnt>0;cnt--){
roman.push(RomanMap[k])
}
}
)
return roman.join("-")
}
function main(...param) {
console.show("参数:" + param, "结果:" + algorithm(param))
testPerformance(algorithm, param)
}
main(1414);
所以结果是:M-CD-X-IV
请你自动动手试一下:在线编程环境