五家共井

来源:互联网 发布:淘宝客服热线 编辑:程序博客网 时间:2024/06/02 07:29

算法题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,以这个条件跳出循环。

0 0
原创粉丝点击