百雞問題

百雞問題

百雞問題是一個數學問題,出自中國古代約5—6世紀成書的《張邱建算經》,是原書卷下第38題,也是全書的最後一題,該問題導致三元不定方程組,其重要之處在於開創“一問多答”的先例。

基本介紹

  • 中文名:百雞問題
  • 時間:5—6世紀
  • 出處:《張邱建算經》
  • 性質:數學問題
問題,歷史淵源,

問題

今有雞翁一,值錢伍;雞母一,值錢三;雞鶵三,值錢一。凡百錢買雞百隻,問雞翁、母、鶵各幾何?答曰:雞翁四,值錢二十;雞母十八,值錢五十四;雞鶵七十八,值錢二十六。又答:雞翁八,值錢四十;雞 母十一,值錢三十三,雞鶵八十一,值錢二十七。又答:雞翁十二,值錢六十;雞母四、值錢十二;雞鶵八十 四,值錢二十八。”

歷史淵源

原書沒有給出解法,只說如果少買7隻母雞,就可多買4隻公雞和3隻小雞。所以只要得出一組答案,就可以推出其餘兩組答案。中國古算書的著名校勘者甄鸞李淳風注釋該書時都沒給出解法,只有約6世紀的算學家謝察微記述過一種不甚正確的解法。到了清代,研究百雞術的人漸多,1815年駱騰風使用大衍求一術解決了百雞問題。1874年丁取忠創用一個簡易的算術解法。在此前後時曰醇(約1870)推廣了百雞問作《百雞術衍》,從此百雞問題和百雞術才廣為人知。百雞問題還有多種表達形式,如百僧吃百饅,百錢買百禽等。宋代楊輝算書內有類似問題,中古時近東各國也有相仿問題流傳。例如印度算書和阿拉伯學者艾布·卡米勒的著作內都有百錢買百禽的問題,且與《張邱建算經》的題目幾乎全同。
解法
數學解法
從現代數學觀點來看,實際上是一個求不定方程整數解的問題。解法如下:
設公雞、母雞、小雞分別為x、y、z 只,由題意得:
①……x+y+z =100
②……5x+3y+(1/3)z =100
有兩個方程,三個未知量,稱為不定方程組,有多種解。
令②×3-①得:7x+4y=100;
所以y=(100-7x)/4=25-2x+x/4
令x/4=t, (t為整數)所以x=4t
把x=4t代入7x+4y=100得到:y=25-7t
易得z=75+3t
所以:x=4t
y=25-7t
z=75+3t
因為x,y,z為正整數
所以4t大於0
25-7t大於0
75+3t大於0
解得t大於0小於等於25/7 又因為t為整數
所以t=1時
x =4;y =18;z =78
當t=2時
x =8;y =11;z =81
當t=3時
x =12;y =4;z =84
C語言解法
#include <stdio.h>void main()(c++用 int main){    int cocks=0,hens,chicks;    while(cocks<=20)    {        hens=0;        while(hens<=33)        {            chicks=100-cocks-hens;            if(5.0*cocks+3.0*hens+chicks/3.0==100.0)            printf("公雞%d只,母雞%d只,小雞%d只\n",cocks,hens,chicks);            hens++;        }        cocks++;    }}
輸出結果為:
公雞0隻,母雞25隻,小雞75隻
公雞4隻,母雞18隻,小雞78隻
公雞8隻,母雞11隻,小雞81隻
公雞12隻,母雞4隻,小雞84隻
java語言解法
public class BaiJiwenti{public static void main (String [] args){for (int x = 0; x <= 19; x++){for (int y = 0; y <= 33; y++){int z = 100 - x - y;if((x * 5 + y * 3 + z / 3 == 100 ) && z % 3 == 0){System.out.println("可買雞翁只數:" + x);System.out.println("可買雞母只數:" + y);System.out.println("可買雞雛只數:" + z);}}}}}
C#語言解法
程式如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 例4_17_13計科_0103_百錢買百雞{class Program{static void Main(string[] args){double x, y, z;Console.WriteLine("公雞\t母雞\t小雞\t");for (x = 0; x <= 1000; x++){for (y = 0; y <= 1000; y++){z = 1000 - x - y;if (5 * x + 3 * y + z / 3 == 1000)Console.WriteLine("{0}\t{1}\t{2}\t", x, y, z);} Console.ReadKey();}}}
PHP語言解法
//$a為公雞,$b為母雞,$c為小雞(每類雞,至少得有1隻)for($a=1;$a<20;$a++){    for($b=1;$b<34;$b++){        $c=100-$a-$b;        if($a*5+$b*3+$c/3 ==100){        echo "公雞",$a,"只,母雞",$b,"只,小雞",$c,"只<br/>";        }    }}最終結果公雞4隻,母雞18隻,小雞78隻公雞8隻,母雞11隻,小雞81隻公雞12隻,母雞4隻,小雞84隻
Java語言解法以及結果
易語言解法以及結果.程式集 視窗程式集_啟動視窗.子程式 _按鈕1_被單擊.局部變數 x, 整數型, , , 公雞數.局部變數 y, 整數型, , , 母雞數編輯框2.加入文本 (“公雞” + “  ” + “母雞” + “  ” + “雛雞” + #換行符).計次循環首 (20, x)    .計次循環首 (33, y)        .如果真 (x × 5 + y × 3 + (100 - x - y) ÷ 3 = 100)            編輯框2.加入文本 (#換行符 + 到文本 (x) + “  ” + “  ” + 到文本 (y) + “  ” + “  ” + 到文本 (100 - x - y) + #換行符 + #換行符)        .如果真結束    .計次循環尾 ().計次循環尾 ()最終結果:公雞  母雞  雛雞4    18    788    11    8112    4    84
public static void main(String[] args) { int k=0; for(int i=0;i<100;i++){ for(int j=0;j<100;j++){ k=100-i-j; if(i+j+k==100&&3*i+2*j+k/3==100){ if(k%3==0){ System.out.print("公雞:"+i); System.out.print("母雞:"+j); System.out.print("小雞:"+k); System.out.println(); } } } } }最終結果:公雞0隻,母雞25隻,小雞75隻公雞4隻,母雞18隻,小雞78隻公雞8隻,母雞11隻,小雞81隻公雞12隻,母雞4隻,小雞84隻

相關詞條

熱門詞條

聯絡我們