Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将数字分成相等的部分并填充到数组中_Javascript - Fatal编程技术网

Javascript 将数字分成相等的部分并填充到数组中

Javascript 将数字分成相等的部分并填充到数组中,javascript,Javascript,给定的数字,number,n和interval我试图将它们划分为相等的间隔,并将它们预先填充到一个数组中 规则是,如果我们把这些相等的间隔加起来,它就需要和原来的数字相加 示例: 输入: 输出: 输入: 输出: 输入 数字=9,数字=2,间隔=3 输出 +---+---+---+ | 4 | 4 | 1 | +---+---+---+ 问题是我创建的数组没有按照间隔值等分。 这是我正在尝试的代码 var股息=9, 除数=2, 间隔=3; var res=(函数(数,n,间隔){ 值=

给定的数字,
number
n
interval
我试图将它们划分为相等的间隔,并将它们预先填充到一个数组中

规则是,如果我们把这些相等的间隔加起来,它就需要和原来的数字相加


示例: 输入:

输出:


输入:

输出:


输入 数字=9,数字=2,间隔=3

输出

+---+---+---+
| 4 | 4 | 1 |
+---+---+---+

问题是我创建的数组没有按照间隔值等分。

这是我正在尝试的代码

var股息=9,
除数=2,
间隔=3;
var res=(函数(数,n,间隔){
值=[];
while(编号和编号及间隔){
如果(数字%2==0)
a=数学楼层(编号/n);
其他的
a=数学单元(数字/n);
n--;
数字-=a;
间隔--;
价值观。推动(a);
}
返回值;
})(股息、除数、区间);

控制台日志(res)看起来您需要三个部分的解决方案,其中

  • 总和等于值与长度的乘积,

    然后将值分布到结果数组的长度上

  • 总和小于值与长度的乘积,

    然后计算较大的值
    left
    ,并将该值作为计数分布在该值上,其余值取另一个值
    right

  • 总和大于值与长度的乘积,

    这里取该值作为要分配的最大值,并计算左侧的计数和要分配的
    右侧的smaler值

函数getParts(总和,n,长度){ 左,右; if(n*length==sum)返回数组.from({length},=>n); 如果(n*长度<总和){ 左=数学楼层(总和/n); }否则{ 左=n; n=数学楼层(总和/左侧); } 右=(和-左*n)/(长度-n); 返回数组。from({length},({,i)=>ilog(getParts(8,5,4).join(“”));//5.1.1步骤:

  • 使用
    Math.ceil(number/(n*interval))
    查找复合词(我不知道该怎么称呼它),以了解将
    n
    乘以每个
    区间中的最大数的次数
  • n*component
    计算
    max\u n
    ,这是每个
    间隔中的最大数
  • 迭代计算
    间隔的次数
  • 在每次迭代中,
    • 如果
      max\u n
      大于或等于当前
      number
      ,则按
      max\u n
      并减去
      number
    • 否则按下其余按钮(
      number
  • var res=(函数(数,n,间隔){
    让值=[];
    设复合=数学单元(数/(n*区间))
    设max_n=n*复合
    while(间隔--){
    如果(数字>=最大值){
    值。推送(最大值)
    数字-=最大值
    }
    否则{
    值。推送(数字)
    }
    }
    返回值;
    });
    控制台日志(res(8,2,4));
    控制台日志(res(56,8,7));
    
    console.log(res(9,2,3))
    根据我从您的问题中了解到的情况,在填充数组之前需要满足这两个条件
    fill*(interval-1)=number
    ,其中
    fill
    number/n
    开头。基于此,我制定了如下算法

    function populate(number, n, interval) {
      var fill = Math.floor(number / n);
      if (fill * interval < number) fill = Math.ceil(number / interval);
      else if (fill * (interval - 1) > number) fill = Math.ceil(number / (number % interval ? interval - 1 : interval));
      var array = new Array(interval);
      array.fill(fill);
      array[interval - 1] = number - ((interval - 1) * fill);
      return array;
    }
    
    函数填充(数字、n、间隔){
    var fill=数学楼层(编号/n);
    如果(填充*间隔<数字)填充=数学单元(数字/间隔);
    否则如果(fill*(interval-1)>number)fill=Math.ceil(number/(number%interval?interval-1:interval));
    var数组=新数组(间隔);
    数组。填充(fill);
    数组[区间-1]=数-((区间-1)*填充);
    返回数组;
    }
    
    如果需要IE支持,请更改为类似以下的for循环:
    for(var index=0;index

    我还制作了一个代码片段,因此您可以测试多个值

    函数填充(数字、n、间隔){
    var fill=数学楼层(编号/n);
    如果(填充*间隔<数字)填充=数学单元(数字/间隔);
    否则如果(fill*(interval-1)>number)fill=Math.ceil(number/(number%interval?interval-1:interval));
    var数组=新数组(间隔);
    数组。填充(fill);
    数组[区间-1]=数-((区间-1)*填充);
    返回数组;
    }
    document.querySelector(“#calc”).addEventListener(“单击”,函数(){
    var number=document.querySelector(“#number”)。值-0,
    n=document.querySelector(“#n”)。值-0,
    interval=document.querySelector(“#interval”).value-0;
    log(JSON.stringify(populate(number,n,interval));
    });
    
    编号
    N
    间隔
    
    @KunalMukherjee首先,你必须决定哪一条是真正的规则,但对于所有情况,只有一条规则。
    你说过n代表除数,所以在第三种情况下,你有9/2=4.5~4,数组(3)适合[4,4,1]。但是,在情况1中,8/2=4,并且数组(4)适合[4,4,0,0],而不是[2,2,2]。所以,n不代表除数,或者,情况1的结果是错误的。

    在1和2中:n*interval=number,但不在3@KunalMukherjee那么为什么
    number=9,number=2,interval=3
    的输出应该是
    4,4,1
    ,而不是
    3,3,3
    ?@nickzoum,因为
    被除数=9,除数=2
    ,因此,除以
    9/2
    将导致
    4,4,1
    使用您自己的解释,这两个答案都没有任何意义[2,2,2,
    number = 56, n = 8, interval = 7
    
    +---+---+---+---+---+---+---+
    | 8 | 8 | 8 | 8 | 8 | 8 | 8 |
    +---+---+---+---+---+---+---+
    
    +---+---+---+
    | 4 | 4 | 1 |
    +---+---+---+
    
    function populate(number, n, interval) {
      var fill = Math.floor(number / n);
      if (fill * interval < number) fill = Math.ceil(number / interval);
      else if (fill * (interval - 1) > number) fill = Math.ceil(number / (number % interval ? interval - 1 : interval));
      var array = new Array(interval);
      array.fill(fill);
      array[interval - 1] = number - ((interval - 1) * fill);
      return array;
    }