Javascript 更改一个数字以获得算术序列

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

我有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 + 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。