五家共井

算法題2
源:http://www.cnblogs.com/huangxincheng/archive/2012/08/06/2625427.html
五家人共用一口井,甲家的繩子用兩條不夠,還要再用乙家的繩子一條才能打到井水;乙家的繩子用三條不夠,還要再用丙家的繩子
一條才能打到井水;丙家的繩子用四條不夠,還要再用丁家的繩子一條才能打到井水;丁家的繩子用五條不夠,還要再用戊家的繩子一條才能打到井水;戊家的繩子用六條不夠,還要再用甲家的繩子一條才能打到井水。
最後問:井有多深?每家的繩子各有多長?

我還是按照原文章去理解,設甲的長度爲a,乙的長度爲b,丙的長度爲c,丁的長度爲d,戊的長度爲e,設井的長度爲h,
則有:
2a + b = h;
3b + c = h;
4c + d = h;
5d + e = h;
6e + a = h;
則進行處理得到:
a = b + c/2;
b = c + d/3;
c = d + e/4;
d = e + a/5;
這裏的繩子都是整條的,所以原作者推出c是2的倍數,d是3的倍數,e時4的倍數,a是5的倍數。在這裏需要確定2個數然後去推導其他的數,爲了減少推導數量,我們可以從a,c,d,e中選擇2個數作爲已知的。假設我們已知d和e。

`void functionTwo()
{
    int a=0,b=0,c=0,d=0,e=0;
    bool flag = true;
    while (flag)
    {
        d += 3;
        e = 0;
        while (flag)
        {
            e += 4;

            c = d + e/4;
            if(c%2 != 0)
            {
                continue;
            }

            b = c + d/3;

            a = b + c/2;
            if (a%5 != 0)
            {
                continue;
            }

            if ((d - a/5) < e)
            {
                break;
            }
            if ((d - a/5) == e)
            {
                flag = false;
            }

        }
    }

    printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e);
    int h1 = 2*a + b;
    int h2 = 3*b + c;
    int h3 = 4*c + d;
    int h4 = 5*d + e;
    int h5 = 6*e + a;
    printf("h1=%d h2=%d h3=%d h4=%d h5=%d\n",h1,h2,h3,h4,h5);
}`

現在這個問題就變成了一個問題,就是d與e怎麼搭配,才能讓等式成立,則需要一個循環去處理,我們按照以前的邏輯,可能跑不出循環。那先讓d是第一個循環,那麼e什麼時候停止增加,出來讓d增加呢? 因爲最後我們要去判斷((d - a/5) ? e)的關係,我們認爲d要增加是因爲(d - a/5) < e,以這個條件跳出循環。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章