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)=>i log(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;
}