如何使用Javascript

时间:2019-05-13 07:32:11

标签: javascript

我需要将未知整数分为给定数量的偶数部分的能力的帮助,或者至少要尽可能地做到。各部分的总和应为原始值,但各部分应为整数,并且应尽可能接近。

参数 num:整数-应该分成相等部分的数字

parts:Integer-应该分割数字的部分数 进入

返回值 列表(整数)-零件列表,每个索引代表零件,其中包含的数字代表零件的大小。零件的订购顺序从最小到最大。

这就是我所拥有的

var splitInteger = function(num, parts) {
  // Complete this function

  var randombit = num * parts;
  var out = [];

  for (var i = 0; i < parts; i++) {
    out.push(Math.random());
  }

  var mult = randombit / out.reduce(function(a, b) {
    return a + b;
  });

  return out.map(function(el) {
    return el * mult;
  });

}
var d = splitInteger(10, 5)
console.log(d);
console.log("sum - " + d.reduce(function(a, b) {
  return a + b
}));

这是示例测试

let assert = require("chai").assert;
describe('Challenge', function() {
  it('Simple Functionality', function() {
    assert.deepEqual(splitInteger(10,1), [10]);
    assert.deepEqual(splitInteger(2,2), [1,1]);
    assert.deepEqual(splitInteger(20,5), [4,4,4,4,4]);
  });
});

预期输出示例:

零件数返回值。

完全均匀的零件示例10 5 [2,2,2,2,2]。

即使是零件示例20 6 [3,3,3,3,4,4]。

我遇到错误。

3 个答案:

答案 0 :(得分:4)

使用Math.floor(x/y)可以得到最大整数系数,使用x%y可以得到余数。比简单地将余数分解为1并将那些1加到相应数量的项目上

const a = 20;
const b = 6;

//x - dividend, y-divisor
const divideToIntegers = (x, y) => [...Array(y-x%y).fill(Math.floor(x/y)),...Array(x%y).fill(Math.floor(x/y)+1)];

const res = divideToIntegers(a, b);

console.log(res);

答案 1 :(得分:3)

尝试这样。

var splitInteger = function(num, parts) {
  // Complete this function

  var val;
  var mod = num % parts;
  if(mod == 0){
    val = num/parts;
    retData = Array(parts).fill(val);
  } else {
    val = (num-mod)/parts;
    retData = Array(parts).fill(val);
    for(i=0;i<mod;i++){
      retData[i] = retData[i] + 1;
    }
    retData.reverse()
  }

  return retData;

}
var d = splitInteger(20, 6)
console.log(d);
console.log("sum - " + d.reduce(function(a,b){return a+b}));

答案 2 :(得分:0)

极其简单的解决方案:

const splitInteger = (number, parts) => {
    const remainder = number % parts
    const baseValue = (number - remainder) / parts

    return Array(parts).fill(baseValue).fill(baseValue + 1, parts - remainder)
}

要从大到小订购:

const splitInteger = (number, parts) => {
    const remainder = number % parts
    const baseValue = (number - remainder) / parts

    return Array(parts).fill(baseValue).fill(baseValue + 1, 0, remainder)
}

现在作为npm模块:split-integer