java算法---五家共井

古代数学巨著《九章算数》中有这么一道题叫“五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠;乙三绠不足,如丙一绠;

丙四绠不足,如丁一绠;丁五绠不足,如戊一绠;戊六绠不足,如甲一绠,皆及。

意思就是说五家人共用一口井,甲家的绳子用两条不够,还要再用乙家的绳子一条才能打到井水;乙家的绳子用三条不够,还要再用丙家的绳子

一条才能打到井水;丙家的绳子用四条不够,还要再用丁家的绳子一条才能打到井水;丁家的绳子用五条不够,还要再用戊家的绳子一条才能打

到井水;戊家的绳子用六条不够,还要再用甲家的绳子一条才能打到井水。

最后问:井有多深?每家的绳子各有多长?

算法分析:根据题目可以列的一下方程(len为井深)

len1*2+len2 = len

len2*3+len3 = len

len3*4+len4 = len

len4*5+len5 = len

len5*6+len1 = len

进一步化简

len1=len2+len3/2

len2=len3+len4/3

len3=len4+len5/4

len4=len5+len1/5

从上面算式可以得到len3是2的倍数,len4是3的倍数,len5是4的倍数,len1是5的倍数。

代码实现:

package 练习;

public class WJGJ

{

    static void WJGJ(
            int[] len1, int[] len2, int[] len3, int[] len4,
            int[] len5, int[] len) // 五家共井算法

    {

        for (len5[0] = 4;; len5[0] += 4)
            // len5为4的倍数

            for (len1[0] = 5;; len1[0] += 5) // len1为5的倍数

            {

                len4[0] = len5[0] + len1[0] / 5;

                len3[0] = len4[0] + len5[0] / 4;

                if (len3[0] % 2 != 0 || len4[0] % 3 != 0)

                    continue; // 如果不能被2整除或若不能被3整除,进行下一次循环

                len2[0] = len3[0] + len4[0] / 3;

                if (len2[0] + len3[0] / 2 < len1[0])

                    break; // 切回len5[0]循环(因为x太大了)

                if (len2[0] + len3[0] / 2 == len1[0])

                {

                    len[0] = 2 * (len1[0]) + (len2[0]); // 计算井深

                    return;

                }

            }

    }

    public static void main(String[] args)

    {

        int[] len1 = { 0 };

        int[] len2 = { 0 };

        int[] len3 = { 0 };

        int[] len4 = { 0 };

        int[] len5 = { 0 };

        int[] len = { 0 };

        WJGJ(len1, len2, len3, len4, len5, len); // 求解算法

        System.out.printf("五家共井问题求解结果如下:
"); // 输出结果

        System.out.printf("甲家井绳长度为:%d
", len1[0]);

        System.out.printf("乙家井绳长度为:%d
", len2[0]);

        System.out.printf("丙家井绳长度为:%d
", len3[0]);

        System.out.printf("丁家井绳长度为:%d
", len4[0]);

        System.out.printf("戌家井绳长度为:%d
", len5[0]);

        System.out.printf("井深:%d
", len[0]);

    }

}

用c也可以实现

代码如下

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            int a, b, c, d, e, h;

            a = b = c = d = e = h = 0;

            bool flag = true;

            while (flag)
            {
                //4的倍数
                e += 4;

                a = 0;

                while (flag)
                {
                    //5的倍数
                    a += 5;

                    d = e + a / 5;

                    c = d + e / 4;

                    if (c % 2 != 0)
                        continue;

                    if (d % 3 != 0)
                        continue;

                    b = c + d / 3;

                    if (b + c / 2 < a)
                        break;

                    if (b + c / 2 == a)
                        flag = false;
                }
            }

            h = 2 * a + b;

            Console.WriteLine("a={0},b={1},c={2},d={3},e={4} ------h={5}
", a, b, c, d, e, h);

            Console.Read();
        }
    }
}
原文地址:https://www.cnblogs.com/oumyye/p/4302204.html