找次品数学问题


有8个球,编号分别是1至8,其中有6个球一样重。另外两个球都轻1克。为了找出这两个轻球,用天平称了三次,结果如下:
第一次: 1+2>3+4
第二次:5+6<7+8
第三次:1+3+5=2+4+8
判断:两个轻球分别是几号?

请问这个题,我想用一小段代码解决?
这个代码怎么写?

code 程序员

beowulf 9 years, 9 months ago

稍微动下脑子就会知道答案应该是4号和5号咯。不过代码这东西有点死,并没有人脑来的那么智能。那咋办呢?最简单的方法是列出所有的可能情况然后对每种情况按照条件过滤。给个 JS 的示例代码,打开浏览器控制台复制运行可查看结果:


 // 先列出所有的可能情况,假设正常的球是 1 克,那么请求则为 0 克
// 从 8 个球里面挑 2 个轻的,应该会有 8 * 7 / 2 = 28 种情况
var count = 8, normal = 1, light = 0;
var arr = [];
for(var i=0;i<8;i++) {
  for(var j=i+1;j<8;j++) {
    var a = (new Array(count+1)).join().split(",").map(function(){return normal});
    a[i] = a[j] = light;
    arr.push(a);
  }
}

// 对每个情况进行条件判断是否符合条件
var res = arr.filter(function(a) {
  return (a[0]+a[1]>a[2]+a[3]) && 
         (a[4]+a[5]<a[6]+a[7]) && 
         (a[0]+a[2]+a[4]===a[1]+a[3]+a[7])
});

// 输出结果
console.log("符合条件的情况是:");
console.table(res);

res = res.map(function(a){ 
    var k = [];
    a.forEach(function(v,i){ 
        if(v===light) k.push(i+1);
    });
    return k;
});
console.log("符合条件的轻球号为: ");
console.table(res);

公主殿下。 answered 9 years, 9 months ago

Your Answer