首页 > 学院 > 开发设计 > 正文

java算法---五家共井

2019-11-14 23:05:02
字体:
来源:转载
供稿:网友
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("五家共井问题求解结果如下:/n"); // 输出结果        System.out.printf("甲家井绳长度为:%d/n", len1[0]);        System.out.printf("乙家井绳长度为:%d/n", len2[0]);        System.out.printf("丙家井绳长度为:%d/n", len3[0]);        System.out.printf("丁家井绳长度为:%d/n", len4[0]);        System.out.printf("戌家井绳长度为:%d/n", len5[0]);        System.out.printf("井深:%d/n", 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}/n", a, b, c, d, e, h);            Console.Read();        }    }}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表