我有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;
}
谢谢。
答案 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
;)