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();
        }
    }
}
时间: 2024-10-13 20:58:54

java算法---五家共井的相关文章

经典算法题每日演练——第二题 五家共井

原文:经典算法题每日演练--第二题 五家共井 古代数学巨著<九章算数>中有这么一道题叫“五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠:乙三绠不足,如丙一绠: 丙四绠不足,如丁一绠:丁五绠不足,如戊一绠:戊六绠不足,如甲一绠,皆及. 意思就是说五家人共用一口井,甲家的绳子用两条不够,还要再用乙家的绳子一条才能打到井水:乙家的绳子用三条不够,还要再用丙家的绳子 一条才能打到井水:丙家的绳子用四条不够,还要再用丁家的绳子一条才能打到井水:丁家的绳子用五条不够,还要再用戊家的绳子一条才能打

五家共井问题

public class WJGJ { static void WJGJ(){ int len1 = 0; int len2 = 0; int len3 = 0; int len4 = 0; int len5 = 0; int len = 0; for(len5 = 4; ;len5 += 4){ for(len1 = 5; ; len1 += 5){ len4 = len5 + len1/5; len3 = len4 + len5/4; if(len3 % 2 != 0|| len4 % 3

Java进阶(五十七)-基于感知哈希算法的图像配准

Java进阶(五十七)-基于感知哈希算法的pHash图像配准算法 ??毕业论文提交之后,老师交给自己一项任务:图像配准,也就是给你两幅图像,通过系统来判定两幅图像是否为同一副图像.自己作为这一方面的小白,先去网上搜索一下相应的检测方法,当然有现成的API调用最好,花钱也无所谓. ??我们这里采用的基础关键技术叫做 "感知哈希算法"(Perceptual hash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同

java 算法基础

1.算法概要 算法是用于计算.数据处理和自动推理使用的.算法主要是做精确计算和表示一个有限长列的有效方法.算法一般包含清晰定义的指令用于计算函数.基本上也属于一种思考最简洁的方式. 2.算法特征 算法主要包含五个特征 2.1.有穷性: 是指算法必须能在执行有限个步骤后终止: 2.2.确切性: 算法的每一个步骤必须有确切的定义: 2.3.输入项: 一个算法输入有0或多个输入,以刻画预算对象的初始情况,所谓0就是初始化条件: 2.4.输出项: 反馈对数据加工后的结果.没有输出的算法无意义. 2.5.

复习java第五天(枚举、Annotation(注释) 概述)

一.枚举 传统的方式: ?在某些情况下,一个类的对象是有限而且固定的.例如季节类,只能有 4 个对象 ?手动实现枚举类: -private 修饰构造器. -属性使用 private final 修饰. -把该类的所有实例都使用 public static final 来修饰. 练习代码: 1 public class Season { 2 3 //1.因为类的对象是固定的,所以类的属性是常量 4 public final String name; 5 public final String de

java算法 蓝桥杯 格子位置

问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三行,分别输入自然数N,i,j.其中保证N<=24且1<=i<=N,1<=j<=N. 输出格式 输出共四行.第一行为与格子(i,j)同行的所有格子的位置,第二行为与格子(i,j)同列的所有格子的位置,第三行为从左上到右下对角线上的格子的位置,第四行为从左下到右上对角线上的格子的位置

趣味Java算法题(附答案)

[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.println("第1个月的兔子对数:    1"); System.out.println("第2个月的兔子对数:    1"

java算法 蓝桥杯 扶老奶奶街

一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中一个扶过大街的 D :B和C都没有扶老奶奶过街 E :我没有扶老奶奶 已知五个红领巾中有且只有2个人说的是真话,请问是谁扶这老奶奶过了街? 若有多个答案,在一行中输出,编号之间用空格隔开. 例如 A B C D E(这显然不是正确答案) 代码:: package 蓝桥杯java算法训练; publi

Java算法与数据结构

Java算法与数据结构学习 一.数组 //声明数组 dataType[] arrayRefVar; //创建数组 arrayRefVar = new dataType[arraySize]; dataType[] arrayRefVar = new dataType[arraySize]; dataType[] arrayRefVar = {value0, value1, ..., valuek}; 1.使用自定义类封装数组 public class MyArray{ private long