百钱百鸡 java解决

题目:
我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?

百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,
用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。

方法一

思路:总钱数是100 i j k 都是只 所以关系是only = i + j + k;和 money = 5 * i + 3 * j + k/3 找到关系后就让代码自己去试去吧

int timer = 0; //计时器
        for (int i = 0; i < 20; i++) {
            //公鸡5钱一只 i代表只 20-->代表100最多买20只
            for (int j = 0; j < 33; j++) {
                //母鸡3钱一只 j代表只  33-->代表100最多买20只
                for (int k = 0; k < 100; k +=3) {
                    //小鸡1钱三只  K代表只   按理说是300只 但100-->代表最多能买100只
                    int money = 5 * i + 3 * j + k/3;  // k/3会取整 看上面k的循环 都可以被3整除 你可以解释为小鸡3只的卖
                    int only = i + j + k;
                    timer++;
                    if (money == 100 && only == 100) {
                        System.out.printf("公鸡:%d 母鸡:%d 小鸡:%d %n", i, j, k);
                    }
                }
            }
        }
        System.out.println("运行了" + timer + "次");

结果

公鸡:0 母鸡:25 小鸡:75 
公鸡:4 母鸡:18 小鸡:78 
公鸡:8 母鸡:11 小鸡:81 
公鸡:12 母鸡:4 小鸡:84 
运行了22440次

方法二

思路:总钱数是100 i j k 都是钱 所以关系是only = i/5 + j/3 + 3*k;和 money = 5 * i + 3 * j + k/3 找到关系后就让代码自己去试去吧
这个思路小心取整问题

int timer = 0;
        for (int i = 0; i < 100; i+=5) {
            //公鸡5钱一只  i代表钱  i每次加5 你可以解释为只要买公鸡就花5 100-->理解为最多100元
            for (int j = 0; j < 100; j+=3) {
                //母鸡3钱一只  j代表钱  j每次加5 你可以解释为只要买母鸡鸡就花3 100-->理解为最多100元
                for (int k = 0; k < 100; k ++) {
                    //小鸡1钱三只  k代表钱 100-->理解为最多100元
                    int money = i + j + k;
                    int only = i/5 + j/3 + 3*k;  //这样就不怕取整问题  看上面循环就知道原因了
                    timer++;
                    if (money == 100 && only == 100) {
                        System.out.printf("公鸡:%d 母鸡:%d 小鸡:%d %n", i/5  ,j/3 , 3*k);
                    }
                }
            }
        }
        System.out.println("运行了" + timer + "次");

结果

公鸡:0 母鸡:25 小鸡:75 
公鸡:4 母鸡:18 小鸡:78 
公鸡:8 母鸡:11 小鸡:81 
公鸡:12 母鸡:4 小鸡:84 
运行了68000次

方法三(看懂了上面下面你就更懂了 我只举一例)

思路:不过i j k 是代表钱还是只,都可以相互转换,只要小心取整问题都ok
关系为:
money = 5 * i + 3 * j + k
only = i + j + 3*k

int timer = 0;
        for (int i = 0; i < 20; i++) {
            //公鸡5钱一只  i代表只
            for (int j = 0; j < 33; j++) {
                //母鸡3钱一只   j代表只
                for (int k = 0; k < 100; k ++) {
                    //小鸡1钱三只  k代表钱  
                    int money = 5 * i + 3 * j + k;
                    int only = i + j + 3*k;
                    timer++;
                    if (money == 100 && only == 100) {
                        System.out.printf("公鸡:%d 母鸡:%d 小鸡:%d %n", i, j, 3*k);
                    }
                }
            }
        }
        System.out.println("运行了" + timer + "次");

结果

公鸡:0 母鸡:25 小鸡:75 
公鸡:4 母鸡:18 小鸡:78 
公鸡:8 母鸡:11 小鸡:81 
公鸡:12 母鸡:4 小鸡:84 
运行了66000次