难得父母有这个兴致,在我们家庭三人群里讨论上脑筋算数题了,我也花点精力捣鼓捣鼓。

捡鸡蛋求个数题

这个题印象中见过,从来没算过,题目是:有这么一筐鸡蛋,
1个1个拿正好拿完;2个2个拿还剩1个;3个3个拿正好拿完;
4个4个拿还剩1个;5个5个拿还剩4个;6个6个拿还剩3个;
7个7个拿还剩5个。8个8个拿还剩1个。9个9个拿正好拿完。求筐里有多少鸡蛋。
父母算的很来劲儿,又分析是奇数,又分析是9的位数,还是3和9的公倍数…但是从我的角度看就是上学学的C语言期末考的一个求余算数嘛,罗列几个求余,条件都符合就可以了,于是答案如下:

var Negg = 9;
do {
    if (
        0 == Negg % 3 &&
        1 == Negg % 4 &&
        4 == Negg % 5 &&
        3 == Negg % 6 &&
        5 == Negg % 7 &&
        1 == Negg % 8 &&
        0 == Negg % 9
        ) {
        alert('【发现检出】 试值' + Negg);
        break;
    }
    Negg += 2;
} while ( Negg < 9999);

可得结果为369。

找特征6位数题

第一题坑还不深,用求余公式在4位数内找一下得出结果。6位数的题目是:有这么一个6位数,本身每个位上的数字相互不重复,而且它乘以2、3、4、5得到的数也是6位数,而且每个位上的数字还是1倍本身每个位上的那6个数字,只是所处位置不同。我试着javascript编程,写出穷举条件后,一运行就导致Chrome崩溃,难点出现 了,3位数可以一下子算一遍,但是6位数而且要反复试几个条件一下子就算不得结果。
改变思路,用setTimeout一个数一个数地间歇性排除,这样的方法可以维持不崩溃,得到结果只是时间的问题,经实验,花近2个小时,我得到了这个神奇的6位数142857。嗯。看来一些无关紧要的密码可以用它了,忘了还有线索能想起来。代码如下:

var Nstart = 100000;
var Ttime, Ntest = Nstart, Nrow = 9, Nbit = Ntest.toString(10).length - 1;
var Nrang = Math.floor(Math.pow(10, Nbit + 1) / Nrow -1);
function Fsort(Nnum) {
    var Nsort, Npow = Nbit, Asort = new Array();
    Nnum ? Nsort = Nnum : Nsort = Ntest; 
    var Npush = Math.floor(Nsort/Math.pow(10, Npow))%10;
    Asort.push(Npush);
    do {
        Npow--;
        Npush = Math.floor(Nsort/Math.pow(10, Npow))%10;
        if (Asort.some(function (Vitem, Nindex, Aarr) {
            if (Npush == Vitem) {
                if (!Nnum) {
                    if(Npow) {
                        document.write(Ntest +'【数字重复】<br>');
                        Ntest = 0;
                        for (var Nmult = 0; Nmult < Asort.length; Nmult++) Ntest += Asort[Nmult] * Math.pow(10, (Nbit - Nmult));
                        Ntest += ++Npush * Math.pow(10, Npow);
                        document.write('【成段重复】跳至 '+ Ntest +'<br>');
                    } else document.write(Ntest +'【末位重复】<br>');
                }
                return true;
            }
        })) {
            return false;
        } else {
            Asort.push(Npush);
        }
    } while (Npow > 0);
    return Asort.sort().join('');
}
function Ffilt() {
    if (Nrang < ++Ntest) {
        Ttime = null;
        if (1 < Nrow) {
            document.write('<p>【 '+ Nrow +' 倍乘穷举已到尽头】 准备降为 '+ --Nrow +' 倍乘</p>');
            Ntest = Nstart, Nbit = Nstart.toString(10).length - 1;
            Nrang = Math.floor(Math.pow(10, Nbit + 1) / Nrow -1);
            Ttime = setTimeout(Ffilt, 6666);
        }
        return;
    }
    document.body.lastElementChild.scrollIntoView(false);
    if (!(Ntest%765)) {
        document.body.innerHTML = '【清屏幕】<br>';
    }
    var Ssort = Fsort();
    if (!Ssort) {
        Ttime = setTimeout(Ffilt, 66);
        return;
    }
    for (var Nmultiply = Nrow; Nmultiply > 1; Nmultiply--) {
        if (Ssort != Fsort(Ntest * Nmultiply, 1)) {
            document.write(Ntest +'【倍数不符】<br>');
            Ttime = setTimeout(Ffilt, 99);
            return;
        }
    }
    Ttime = null;
    Nrang = '<p style="color:green;font-size:3em;">【发现检出】 试值 '+ Ntest;
    do {
        Nrang += '<br>乘 '+ Nrow +' 倍 '+ Ntest * Nrow;
    } while (Nrow-- > 1);
    document.body.innerHTML = Nrang + '</p>';
    return;
}
document.write('<p>【准备穷举】 范围 '+ Ntest +' 至 '+ Nrang +'</p>');
document.body.style.paddingBottom = '6em';
Ffilt();

思路是从100000起对每一个数拆得每一位上的数字,这时下一位上的数字如果与前面某一位的重复就排除了,未能排除则再进行乘法算,结果和1倍本身数验证每位上的数字特征,这个验证是把6个数取出排序,这样不同位置上的数字排序后同位置上数应该相同。
既然代码都写了,就试了下7位数,花了整整一个下午的时间得到结果就是…自己好傻啊!!
脚本算数

用javascript很方便,可以在浏览器按F12后直接粘代码进去一回车就运行了。有兴趣的可以试试,您有更好的算法欢迎指教。

Next Post Previous Post