五組數(shù)字部凑,對(duì)方心里想一個(gè)數(shù),依次詢問(wèn)是否在組中碧浊,之后即可知道對(duì)方所想數(shù)字
// 比如說(shuō)30以內(nèi)數(shù)字:
// 第1組: 7 1 17 19 13 3 31 27 25 9 11 29 21 15 5 23
// 第2組: 10 30 2 3 11 18 23 7 14 19 31 26 6 27 15 22
// 第3組: 7 14 15 31 12 22 29 20 30 13 6 5 21 4 23 28
// 第4組: 12 8 31 11 24 25 14 30 9 15 29 26 10 28 13 27
// 第5組: 23 19 27 25 20 16 18 30 17 22 31 24 21 29 26 28
下面附代碼涂邀,僅供參考!
// 二進(jìn)制十進(jìn)制轉(zhuǎn)換
/**
* 10進(jìn)制轉(zhuǎn)2進(jìn)制
* @param target
* @returns {string}
*/
function ten2two(target) {
const yu_arr = [target % 2];
let val = Math.floor(target / 2);
while (val > 1) {
yu_arr.push(val % 2);
val = Math.floor(val / 2);
}
if (val === 1) {
yu_arr.push(val);
}
return yu_arr.reverse().join('');
}
/**
* 2進(jìn)制轉(zhuǎn)10進(jìn)制
* @param target
* @returns {*}
*/
function two2ten(target) {
return [...`${target}`].reverse().reduce((origin, item, index) => {
origin += item * Math.pow(2, index);
return origin;
}, 0);
}
/**
* 根據(jù)指定長(zhǎng)度生成對(duì)應(yīng)的數(shù)據(jù)
* @param count 指定長(zhǎng)度
* @returns {Array} 分配好的數(shù)據(jù)數(shù)組
*/
function factory(count) {
// 生成二進(jìn)制數(shù)組
const results = Array(count)
.fill(null)
.map((item, index) => Number(ten2two(index + 1)));
// 獲取二進(jìn)制最大長(zhǎng)度
const maxLength = String(Math.max(...results)).length;
// 生成對(duì)應(yīng)長(zhǎng)度的空數(shù)組
const dataObj = Array(maxLength)
.fill(null)
.reduce((origin, item, index) => {
origin[index + 1] = [];
return origin;
}, {});
// 將2進(jìn)制數(shù)據(jù)對(duì)應(yīng)位等于1的10進(jìn)制數(shù)字放到同一個(gè)數(shù)組中
results.forEach(result => {
for (let i = 0; i < maxLength; i++) {
const num = Math.floor(result / Math.pow(10, i) % 10);
if (num === 1) {
dataObj[i + 1].push(two2ten(result));
}
}
});
return Object.keys(dataObj).map(key => dataObj[key].sort(() => Math.random() - 0.5));
}
// 比如說(shuō)31以內(nèi)的數(shù)據(jù)
const data2 = factory(31);
data2.forEach((item, index) => console.log(`// 第${index + 1}組:`, ...item));
原理很簡(jiǎn)單箱锐,就是利用2進(jìn)制比勉,第一組代表1(2的零次方),后面依次2驹止、4浩聋、8、16臊恋,把存在的對(duì)應(yīng)組的數(shù)字相加即是答案衣洁,試試看!