天天看點

今日算法之_3百元買百雞_4五家共井

3、百元買百雞

公雞5文錢一隻,母雞3文錢一隻,小雞3隻一文錢

用100文錢買一百隻雞,其中公雞,母雞,小雞都必須要有,問公雞,母雞,小雞要買多少隻剛好湊足100文錢。

package com.hlj.arith.domo0003百元買百雞;

import org.junit.jupiter.api.Test;

/**
 * 作者 :HealerJean
 * 題目
         公雞5文錢一隻,母雞3文錢一隻,小雞3隻一文錢,
         用100文錢買一百隻雞,其中公雞,母雞,小雞都必須要有,問公雞,母雞,小雞要買多少隻剛好湊足100文錢。
   解題思路:
        國中數學思維 公雞x  母雞y 小雞z
        5*x + 3*y + z/3 = 100
        x + y + z = 100
    那麼我們首先想到就是for循環了吧

 */
public class TestMain {

    @Test
    public void start(){
        for(int x = 0; x<=100 ;x++){ //這裡的100是指個數,而且不排除一隻母雞也沒有
            for(int y = 0 ; y <=100-x; y++){
               int z = 100 - x -y;
               if(z%3==0){ //這個判斷容易遺漏,因為我們注意是必須被3整除,如果沒有這個if的時候,下面的組合可能買到死的小雞哦,哈哈
                   if(( 5*x + 3*y + z/3 )==100){
                       System.out.println("公雞"+x+"母雞"+y+"小雞"+z);
                   }
               }
            }
        }
    }

}

/**
 結果

 公雞0母雞25小雞75
 公雞4母雞18小雞78
 公雞8母雞11小雞81
 公雞12母雞4小雞84

 */      

4、五家共井

package com.hlj.arith.domo0004五家共井;

import org.junit.jupiter.api.Test;

/**
作者:HealerJean
由來:
     古代數學巨著《九章算數》中有這麼一道題叫“五家共井,甲二绠(汲水用的井繩)不足,如(接上)乙一绠;乙三绠不足,如丙一绠;
     丙四绠不足,如丁一绠;丁五绠不足,如戊一绠;戊六绠不足,如甲一绠,皆及。
題目:
    意思就是說五家人共用一口井
    甲家的繩子用兩條不夠,還要再用乙家的繩子一條才能打到井水;
    乙家的繩子用三條不夠,還要再用丙家的繩子一條才能打到井水;
    丙家的繩子用四條不夠,還要再用丁家的繩子一條才能打到井水;
    丁家的繩子用五條不夠,還要再用戊家的繩子一條才能打到井水;
    戊家的繩子用六條不夠,還要再用甲家的繩子一條才能打到井水。

 最後問:井有多深?每家的繩子各有多長?

解題思路:

  井深 h,繩長 a b c d e
     2*len1+len2=h
     3*len2+len3=h
     4*len3+len4=h
     5*len4+len5=h
     6*len5+len1=h
 通過上面的方程:
    len1 = len2+len3/2 1和2
    len2 = len3+len4/3 2和3
    len3 = len4+len5/4 3和4
    len4 = len5+len1/5 4和5
 得到上面的結果之後,我們限制一下,假定都是整數,古代麼,哪裡來那麼多小數。是以假定都是整數
 len3為2的倍數 len4為3的倍數 len5為4的倍數 len1為5的倍數 len1肯定是最長的,通過上述了解

 */
public class TestMain {

    @Test
    public void start() {
        //因為沒有最大值,是以for循環中不設定最大
        int len,len1,len2,len3,len4,len5;
        for(len5=4;;len5+=4){
            for(len1=5;;len1+=5){ //這裡我們寫入它,因為我一步步走到它的時候,可以通過判斷它的大小進行結束循環
                len4 = len5 + len1 / 5;
                if(len4%3==0){//如果len4能被3整除
                    len3 = len4 + len5 / 4;
                    if (len3 % 2 == 0) { //如果len3能被2整除
                        len2 = len3 + len4 / 3;
                        //這裡非常關鍵,用的是第二層for循環中的資料,len1 相等的時候是正确的,
                        // 當大于計算結果的時候,就切出目前循環因為這個時候的len1太大了,再這麼下去會讓for'循環中的len1更大
                        // 當結果比較小的是,我們繼續循環
                        if (len1 > len2 + len3 / 2) {
                            break;
                        } else if (len1 == len2 + len3 / 2) {
                            len = len2 + len1 * 2;
                            System.out.println("井深為:" + len);
                            System.out.println("甲家繩子長度為:" + len1);
                            System.out.println("乙家繩子長度為:" + len2);
                            System.out.println("丙家繩子長度為:" + len3);
                            System.out.println("丁家繩子長度為:" + len4);
                            System.out.println("戊家繩子長度為:" + len5);
                        }
                    }

                }


            }
        }
    }

}

/**
 井深為:721
 甲家繩子長度為:265
 乙家繩子長度為:191
 丙家繩子長度為:148
 丁家繩子長度為:129
 戊家繩子長度為:76
 */