JavaScript算法小集(二)

1.罗马数字

基本罗马数字为0~3999,其基本组数规则为2点:
1.基本数字 Ⅰ、X 、C 自身连用构成数字、或者放在大数的右边连用构成数字都不能超过三个(例如:III、VIII);放在大数左边只能用一个(例如:IX);
2.基本数字 V 、L 、D 不能放在大数左边构成数字;放在大数右边构成数字只能用一个(例如:XV);

阿拉伯数字转换为罗马数字主要思路:
1.计算千、百、十、个位上的数字;
2.逐一转换千、百、十、个位的罗马数字;
3.将千、百、十、个位的罗马数字组合成最终的罗马数字

function convertRoman(num) {
  if(!isNaN(num) && num < 4000 && num >= 0){
    var newNum = Math.floor(num);
    var roman = [['M'], ['C','D'],['X','L'],['I','V']];
    var romanNum = [];
    var arr = [];
    romanNum[0] = Math.floor(newNum / 1000);
    romanNum[1] = Math.floor((newNum % 1000) / 100);
    romanNum[2] = Math.floor((newNum % 100) / 10);
    romanNum[3] = Math.floor(newNum % 10);
    for(var i = 0; i < 4; i++){
      if(romanNum[i]){
        switch(romanNum[i]){
          case 1:
          case 2:
          case 3:
            for(var j = 0; j < romanNum[i]; j++){
              arr.push(roman[i][0]);
            }
            break;
          case 4:
            arr.push(roman[i][0]);
            arr.push(roman[i][1]);
            break;
          case 5:
            arr.push(roman[i][1]);
            break;
          case 6:
          case 7:
          case 8:
            arr.push(roman[i][1]);
            for(j = 0; j < (romanNum[i]-5); j++){
              arr.push(roman[i][0]);
            }
            break;
          case 9:
            arr.push(roman[i][0]);
            arr.push(roman[i-1][0]);
            break;
          case 10:
            arr.push(roman[i+1][0]);
            break;
        }
      }
    }
  }
  return arr.join('');
}

2.斐波那契-奇数求和

斐波纳契数列:
斐波纳契数列中的前几个数字是 1、1、2、3、5 和 8,随后的每一个数字都是前两个数字之和。
斐波那契数列奇数求和简单思路:
1.先构造数列,然后同时把符合要求的元素放入新的数组,最后求和;
2.以数列条件直接构造数组,用于求和。

function sumFibs(num) {
  var init = 0;
  var numArr = [1];
  var index = 0;
  var sum = 0;
  num = Math.floor(num);
  while(init < num){
    init = numArr[index];
    if(index){
      init += numArr[index-1];
    }
    if(init<=num){
      numArr.push(init);
    }
    index++;
  }
  for(var i in numArr){
    if(numArr[i]%2 === 0)continue;
    sum += numArr[i];
  }
  return sum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值