Javascript 更改一个数字以获得算术序列
我有3个数字,我只需要改变一个数字就可以得到算术序列。差异必须尽可能小 例如,如果我有数字10 19 30,我有三个选项:Javascript 更改一个数字以获得算术序列,javascript,Javascript,我有3个数字,我只需要改变一个数字就可以得到算术序列。差异必须尽可能小 例如,如果我有数字10 19 30,我有三个选项: var nums = [961587, 704764, 380219]; var a = nums[0]; var b = nums[1]; var c = nums[2]; var diff = ((b - a) + (c - b)) / 2; var result = Infinity; if(a + diff !== b && a + diff
var nums = [961587, 704764, 380219];
var a = nums[0];
var b = nums[1];
var c = nums[2];
var diff = ((b - a) + (c - b)) / 2;
var result = Infinity;
if(a + diff !== b && a + diff + diff !== c) {
result = Math.min(result, Math.abs(b - diff - a));
}
if(b - diff !== a && b + diff !== c) {
result = Math.min(result, Math.abs(a + diff - b));
}
if(c - diff !== b && c - diff - diff !== a) {
result = Math.min(result, Math.abs(b + diff - c));
}
if(result === Infinity) {
result = 0;
}
1,将19
更改为20
(差异为1),顺序为10 20 30
(逐步10)
2、将30
更改为28
(差异为2),顺序为101928
(按9步)
3、将
10
更改为8
(差异为2),顺序为8 19 30
(按11步)
我将选择第一个选项,因为我想要最小的差异。所以结果是1
我编写了一个javascript程序来解决这个问题,但它有时会给我错误的结果,我不知道为什么:
var nums = [961587, 704764, 380219];
var a = nums[0];
var b = nums[1];
var c = nums[2];
var diff = ((b - a) + (c - b)) / 2;
var result = Infinity;
if(a + diff !== b && a + diff + diff !== c) {
result = Math.min(result, Math.abs(b - diff - a));
}
if(b - diff !== a && b + diff !== c) {
result = Math.min(result, Math.abs(a + diff - b));
}
if(c - diff !== b && c - diff - diff !== a) {
result = Math.min(result, Math.abs(b + diff - c));
}
if(result === Infinity) {
result = 0;
}
谢谢。以下是您需要执行的操作的总体布局: 把你的号码配对(即AB、AC、BC)。对于每一对,假设这是您的“正常”步骤(对于
AC
,它将是该步骤的两倍),并确定第三个数字必须适合的位置
然后将计算出的第三个数字与实际的第三个数字进行比较,得出差值
差距越小越好
考虑到这一点,下面是一些示例代码:
var adiff = Math.abs(a-(b-(c-b))); // can also be a-2*b+c
var bdiff = Math.abs(b-(a+(c-a)/2); // or b-a/2-c
var cdiff = Math.abs(c-(b+(b-a))); // or c-2*b+a;
switch(Math.min(adiff,bdiff,cdiff)) {
case adiff:
alert("A is closest to where it should be: "+a+" => "+(a-2*b+c));
break;
case bdiff:
alert("B is closest to where it should be: "+b+" => "+(b-a/2+c));
break;
case cdiff:
alert("C is closest to where it should be: "+c+" => "+(c-2*b+a));
break;
}
更精明的读者会注意到,
adiff===cdiff
;) “将10
更改为8
”是2的差值,而不是3。