【算法训练营】数值计算篇

1. 将一个指定整数值等分成指定的数量,最终返回这个能被等分的整数值

  /**
   * @param {Number}
   * @return {Number}
   */  
function intervalHandle (num, num_interval) {
      if (indexOfHandle(num, num_interval)) {
        return num
      } else {
        for (var i = 0; i <= num_interval; i++) {
          var num_new = num
              num_new += i;
          if (indexOfHandle(num_new, num_interval)) {
            return num_new
          }
        }
      }
      function indexOfHandle(x, y) {
        return String((x / y)).indexOf('.') === -1
      }
  }
  intervalHandle(1999, 10) // =>  2000
  // intervalHandle(给定的值, 要等分的个数)
  // 应用场景: 图表x/y轴计算最大值和间隔值

2. 判断一个数是不是质数/素数

概念:

  • 质数又称素数。一个大于 1 的自然数,除了 1 和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
  • 0 和 1 既不是质数也不是合数,最小的质数是 2
 /**
   * @param {Number}
   * @return {Number}
   */  
function isPrime(num) {
  if (num <= 3) return n > 1
  let sqrt = parseInt(Math.sqrt(num))
  for (let i = 2; i <= sqrt; i++) {
    if (num % i === 0) {
      return false
    }
  }
  return true
}
console.log(isPrime(10)) // => false

3. 计算两个数字之间的连续值(输入1,4 =>输出1,2,3,4)

function continuousValue(numStart,numEnd){
        let a=parseInt(numStart);
      let b=parseInt(numEnd);
      let c = [];
      if (numStart - b < 0) {
        const number = Math.abs(a - b) + 1;
        for (let i = a; i < a + number; i++) {
          c.push(i);
        }
      } else if (a - b === 0) {
        c.push(a)
      } else if (a - b > 0) {
        const number = Math.abs(a - b);
        for (let i = a; i > number; i--) {
          c.push(i);
        }
      }
      return c.join(',');
    }
    continuousValue(1,5) // => '1,2,3,4,5'

4. 计算一组数值中每个数值的占比(百分比%)

/**
 * @description: 占比算法(最大余额法)
 * @param {Array} valueList 要计算的数组
 * @param {index} idx 要计算数组中值的下表
 * @param {number} precision 百分比保留几位小数
 */
function getPercentValue(valueList, idx, precision) {
  if (!valueList[idx]) {
      return 0;
  }
  var sum = valueList.reduce(function(acc, val) {
      return acc + (isNaN(val) ? 0 : val);
  }, 0);
  if (sum === 0) {
      return 0;
  }
  var digits = Math.pow(10, precision);
  var votesPerQuota = valueList.map(function(val) {
      return (isNaN(val) ? 0 : val) / sum * digits * 100;
  });
  var targetSeats = digits * 100;
  // 再向下取值,组成数组
  var seats = votesPerQuota.map(function(votes) {
      return Math.floor(votes);
  });
  var currentSum = seats.reduce(function(acc, val) {
      return acc + val;
  }, 0);
  var remainder = votesPerQuota.map(function(votes, idx) {
      return votes - seats[idx];
  });
  while (currentSum < targetSeats) {
      var max = Number.NEGATIVE_INFINITY;
      var maxId = null;
      for (var i = 0, len = remainder.length; i < len; ++i) {
          if (remainder[i] > max) {
              max = remainder[i];
              maxId = i;
          }
      }
      // 对最大项余额加1
      ++seats[maxId];
      remainder[maxId] = 0;
      ++currentSum;
  }
  // 总数占比100%
  return seats[idx] / digits;
}

// 调用
let a = [1,2]
let result = [];
a.forEach((v, i) => {
result.push(getPercentValue(a, i, 0))
});
console.log(result) // [33, 67]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值