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

时间:2014-04-12 13:42:57

标签: javascript

我有3个数字,我需要改变一个数字来获得算术序列。差异必须尽可能小。

例如,如果我有数字10 19 30,我有三个选项:

1,将19更改为20(差异将为1),序列为10 20 30(步骤10)

2,将30更改为28(差异将为2),序列为10 19 28(步骤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;
}

谢谢。

1 个答案:

答案 0 :(得分:2)

以下是您需要做的总体布局:

配对您的号码(即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;)