基于C#实现五家共井

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

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

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

分析:同样这套题也是属于不定方程,拿这个题目的目地就是让大家能够在不定方程组这种范畴问题上做到"举一反三",根据题意我们设井深为h,各家分别为a,b,c,d,e,则可以列出如下方程组:

2a+b=h ①

3b+c=h ②

4c+d=h ③

5d+e=h ④

6e+a=h ⑤

首先我们看下普通青年的想法,他们的想法是找 a,b,c,d,e 之间的对应关系。

依次将 ② 代入 ①,③ 代入 ②,④ 代入 ③,⑤ 代入 ④ 可得如下方程组:

a=b+c/2

b=c+d/3

c=d+e/4

d=e+a/5

从计算机的角度来说,我不希望有小数的出现,所以我可推断: c 一定是 2 的倍数,d 一定是 3 的倍数,e 一定是 4 的倍数,a 一定是 5 的倍数,根据这种关系我们就可以有如下代码:

csharp 复制代码
 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();
         }
     }
 }

同样我们的时间复杂度是 O(N2),急需优化。

我们再来看看文艺青年的想法,他们的想法是找 a,b,c,d,e 中的某个数与 h 的对应关系。

比如我就找 c 与 h 的对应关系,上面的 ①②③④⑤ 可写成如下方程组:

b=h-2a ⑥

c=h-3b ⑦

d=h-4c ⑧

e=h-5d ⑨

a=h-6e ⑩

将 ⑥,⑧,⑨,⑩ 分别代入 ⑦,一阵痉挛后可知:

c=(148/721)h

上面的公式也就表明了 c 和 h 的比例关系,我们令 h=721k,则 c=148k,将其代入 ⑥,⑦,⑧,⑨,⑩ 可得如下方程组

a=265k

b=191k

c=148k

d=129k

e=76k

x=721k

又因为 k>0,所以题目有无数个解。这里我就取 0<k<5,否则绳子已经到达极限了,需要用蛟龙号去深潜了。

csharp 复制代码
 namespace Test
 {
     class Program
     {
         static void Main(string[] args)
         {
             for (int k = 1; k < 5; k++)
             {
                 int h = 721 * k;
 
                 int a = 265 * k;
 
                 int b = 191 * k;
 
                 int c = 148 * k;
 
                 int d = 129 * k;
 
                 int e = 76 * k;
 
                 Console.WriteLine("a={0},b={1},c={2},d={3},e={4} ------h={5}\n", a, b, c, d, e, h);
             }
 
             Console.Read();
         }
     }
 }
相关推荐
满分观察网友z6 分钟前
从一次手滑,我洞悉了用户输入的所有可能性(3330. 找到初始输入字符串 I)
算法
持梦远方13 分钟前
C 语言基础入门:基本数据类型与运算符详解
c语言·开发语言·c++
YuTaoShao27 分钟前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx28 分钟前
c语言-指针(数组)练习2
c语言·数据结构·算法
zzywxc78730 分钟前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
大熊背43 分钟前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
满分观察网友z1 小时前
别怕树!一层一层剥开它的心:用BFS/DFS优雅计算层平均值(637. 二叉树的层平均值)
算法
灵性花火1 小时前
Qt的前端和后端过于耦合(0/7)
开发语言·前端·qt
DES 仿真实践家2 小时前
【Day 11-N22】Python类(3)——Python的继承性、多继承、方法重写
开发语言·笔记·python
杰克尼2 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode