百钱买百鸡延伸的一点思考

这些天在折腾PHP,毕竟毕设得弄,还想弄得漂亮。偶然碰到这么一个百钱买百鸡的(伪)经典问题,这里用JS写了下,毕竟东西都是一样的。

公鸡5文每只,母鸡3文每只,小鸡一文三只。100文钱买100只鸡,每种类必须有一只。

解题,也就是循环。不过真的合适吗?三个循环?这里用了两个循环,因为这些个值都是相互关联的。i <= 15是一个粗略估计的大概,如果超过了的话,就算剩下的钱全拿来买小鸡,也凑不够100只。

[lang:JavaScript]
(function (){
    var i, j, num, mo, k1, k2, res;
    for (i = 1;i <= 15; i++){
        for (j = 1; j <= (100 - i); j++){
            mo = 100 - 5*i - 3*j;
            if(mo <= 0){
                break;
            }
            k1 = mo*3;
            k2 = 100 - i - j;
            if(k1 == k2){
                res = i + "只公鸡" + j + "只母鸡" + k2 + "只小鸡";
                console.log(res);
            }
        }
    }
})();

问题是就这样解决了,不过估摸着是不是可以更快。于是用数学来推算了下。
a+b+c=100、5a+3b+c/3=100
=> b=7*(a+100)/4、c=(a+100)*3/4
=> a是4的倍数
假使母鸡可以不选,全由小鸡替代,要到达100只。
a+(100-5a)*3=100
=> a最大为100/7 即14
=> a最大为12

[lang:JavaScript]
(function (){
    var a = 4, res = [];
    for(; a <= 12; a += 4){
        b = 7 * (a + 100) / 4;
        c = (a + 100) * 3 / 4;
        res.push(a, "只公鸡", b, "只母鸡", c, "只小鸡", "\n")
    }
    console.log(res.join(""))
})();    //highlight.js bug 折腾死我了,上面没写的两个分号放上去就解析成注释了

很简单,一个循环三步搞定了。
但是,思考了下,为这个问题,写这个程序是为了做什么。如果只是为了不用计算,有必要自己酝酿一系列操作,都得出结果了还用计算机打印一下吗?
不过这也试情况而定,比如某人给出要求说:用最快速度打印出几只鸡。那用哪种?

所以说,为了什么而写程序。

后来我又脑补着,可不可以弄这么一个算法,以这样的形式,求解这些系列的方程。

  1. 去掉字符串中的空格
  2. 不合规范的方程式 如++、+-、*+、/=等等一系列情况
  3. 4*x 和 4x 等情况,直接去掉*
  4. 将等号作为分割,等号后边的提取成负数
  5. 括号的情况
  6. 系数
  7. 关系式 b=7*(a+100)/4、c=(a+100)*3/4
  8. 倍数 公约数
  9. 循环

奈何实现起来倒是有点困难,并且没什么意义,除此之外这些东西似乎应该交给底层编译型语言去弄吧?不然光是字符串的拼接匹配操作就得耗费多少时间。真是脑洞有点大