古代數(shù)學(xué)巨著《九章算數(shù)》中有這么一道題叫“五家共井,甲二綆(汲水用的井繩)不足,如(接上)乙一綆;乙三綆不足,如丙一綆;
丙四綆不足,如丁一綆;丁五綆不足,如戊一綆;戊六綆不足,如甲一綆,皆及。
意思就是說五家人共用一口井,甲家的繩子用兩條不夠,還要再用乙家的繩子一條才能打到井水;乙家的繩子用三條不夠,還要再用丙家的繩子
一條才能打到井水;丙家的繩子用四條不夠,還要再用丁家的繩子一條才能打到井水;丁家的繩子用五條不夠,還要再用戊家的繩子一條才能打
到井水;戊家的繩子用六條不夠,還要再用甲家的繩子一條才能打到井水。
最后問:井有多深?每家的繩子各有多長?
算法分析:根據(jù)題目可以列的一下方程(len為井深)
len1*2+len2 = len
len2*3+len3 = len
len3*4+len4 = len
len4*5+len5 = len
len5*6+len1 = len
進(jìn)一步化簡
len1=len2+len3/2
len2=len3+len4/3
len3=len4+len5/4
len4=len5+len1/5
從上面算式可以得到len3是2的倍數(shù),len4是3的倍數(shù),len5是4的倍數(shù),len1是5的倍數(shù)。
代碼實(shí)現(xiàn):
package 練習(xí);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的倍數(shù) for (len1[0] = 5;; len1[0] += 5) // len1為5的倍數(shù) { 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整除,進(jìn)行下一次循環(huán) len2[0] = len3[0] + len4[0] / 3; if (len2[0] + len3[0] / 2 < len1[0]) break; // 切回len5[0]循環(huán)(因?yàn)閤太大了) if (len2[0] + len3[0] / 2 == len1[0]) { len[0] = 2 * (len1[0]) + (len2[0]); // 計(jì)算井深 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.用c也可以實(shí)現(xiàn)
代碼如下
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的倍數(shù) e += 4; a = 0; while (flag) { //5的倍數(shù) 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(); } }}
新聞熱點(diǎn)
疑難解答
圖片精選