複製鏈接
請複製以下鏈接發送給好友

百雞問題

鎖定
百雞問題是一個數學問題,出自中國古代約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    78
8    11    81
12    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只