算法題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,以這個條件跳出循環。