之前提出的公式推法
由於需要列舉所有組合,篩選掉鏡像等步驟
計算時間一下就超過電腦的負荷
以下歸納得到的規則
以秤重三次的公式來說
硬幣代號 A B C D E F G H I J K L 第一次 = = > > > < < < = = > < 第二次 = > = > < > < = < > < = 第三次 > = = < > > = < < < = >
經過調整之後可以得到
硬幣代號 A B C D E F G H I J K L 第一次 > < = = > < > < = < = > 第二次 = > < > < = > < = > < = 第三次 = > < = > < = > < = > <
剛好是由 =、>、<隨機排列組合中取出三組互不為鏡像排列組合而成
互為鏡像 Set 1 = > < = < > Set 2 > < = < > = Set 3 < = > > = <
再根據上表重新整理
硬幣代號 A B C D E F G H I J K L 第一次 ﹝Set 2﹞ ﹝Set 1﹞ ﹝Set 2﹞ ﹝Set 3﹞ 第二次 ﹝Set 1﹞ ﹝Set 2﹞ ﹝Set 2﹞ ﹝Set 2﹞ 第三次 ﹝Set 1﹞ ﹝Set 1﹞ ﹝Set 1﹞ ﹝Set 1﹞
最後將 Set 1 ~ 3 以 1、2、3 簡化
可得數列
第一次 1 1 1 1 第二次 1 2 2 2 第三次 2 1 2 3
同理,秤四次的數列為
第一次 1 1 1 1 1 1 1 1 1 1 1 1 1 第二次 1 1 1 1 2 2 2 2 2 2 2 2 2 第三次 1 2 2 2 1 1 1 2 2 2 3 3 3 第三次 2 1 2 3 1 2 3 1 2 3 1 2 3
這樣便有了規則可循
只要根據秤重的次數
根據以上的規則產生數列
將數字替換成對應的 Set 1 ~ 3
即可得到秤重的公式
以下是根據上述規則寫成 ActionScript 程式:
//
//====================================================================
//
function genSupPattern(base:Number, radix:Number):Array {
var reaAry:Array = [];
var max:Number = 1;
for (var i:Number = 0; i < radix - 1; ++i) {
for (var j:Number = 0; j < max; ++j) {
reaAry.push(j + max);
}
max *= base;
}
return reaAry;
}
function expendPattern(base:Number, radix:Number,
superPattern:Array, setAry:Array):Array {
var formulaAry:Array = [];
for (var i:Number = 0; i < radix; ++i) {
formulaAry[i] = [];
}
for (var i:Number = 0; i < superPattern.length; ++i) {
var x:Number = superPattern[i];
var q:Number = x;
var r:Number = 0;
for (var j:Number = 0; j < radix; ++j) {
r = q % base;
q = Math.floor(q / base);
formulaAry[j] = formulaAry[j].concat(setAry[r]);
}
}
return formulaAry;
}
function genPattern(base:Number, radix:Number, setAry:Array):Array {
var superPattern:Array = genSupPattern(base, radix);
return expendPattern(base, radix, superPattern, setAry);
}
//
//====================================================================
//
// 秤重次數
var radix:Number = 3;
var base:Number = 3;
// 三種基本互相為非鏡像組合
var setAry:Array = [["=", ">", "<"], [">", "<", "="], ["<", "=", ">"]];
//
var formulaAry:Array = genPattern(base, radix, setAry);
//
// 輸出公式字串
for (var i:Number = 0; i < radix; ++i) {
trace(formulaAry[i]);
}
//
//====================================================================
//
Read more...
















