张邱建算经 卷下

  周 甄 鸾 注经
  唐 李淳风 注释
  刘孝孙 撰细草

  今有甲乙丙丁戊五人共猎获鹿约以甲六乙五丙四丁三戊二分之今获鹿五 问各得几何
  答曰
  甲得一鹿四分鹿之二
  乙得一鹿四分鹿之一
  丙得一鹿
  丁得四分鹿之三
  戊得四分鹿之二
  术曰列置甲六乙五丙四丁三戊二各自为差副并为法以鹿数乘未并者各自为实实如法而一草曰置六五四三二并之得二十为法又以甲六乘五鹿得三十鹿以二十除之得一鹿余一与法俱倍之得四分鹿之二以乙五乘五鹿得二十五复以二十除得一鹿四分之一又以丙四乘五鹿得二十为一鹿又以丁三乘五鹿得一十五鹿乃得四分鹿之三又以戊一乘五鹿得一十乃得四分鹿之二合前问
  案此下今有鹿今有垣今有仓三问亦仅有术而无图未足显其立意所在谨依勾股测望少广堆垜各义为补三图于问右用便参观
  今有鹿直西走马猎追之未及三十六步鹿囘直北走马俱斜逐之走五十步未及一十步斜直射之得鹿若鹿不回马猎追之 问几何里而及之
  答曰三里
  术曰置斜逐步数以射步数增之自相乘以追之未及步数自相乘减之余以开方除之所得以减斜逐步数余为法以斜逐步数乘未及步数为实实如法而一
  草曰置斜逐步五十增未及步数十步共六十步自乘得三千六百又置追之未及步数三十六步自相乘得一千二百九十六以减斜自乘步二千三百四步以开方除之得四十八步以减斜逐步数五十余二为法又置未及三十六以斜逐步数五十乘之得一千八百以法除之得九百步乃合前问
  今有垣髙一丈三尺五寸材长二丈二尺五寸倚之于垣末与垣齐 问引材却行几何材末至地
  荅曰四尺五寸
  术曰垣髙自乘以减材长自乘余以开方除之所得以减材余即却行尺数
  草曰置垣髙数自相乘得一百八十二尺二寸五分又以材长数自相乘得五百六尺二寸五分以垣髙自乘减之余三百二十四以开方法除之得一丈八尺以减材长二丈二尺五寸余四尺五寸合前问
  今有仓图
  今有仓东西袤一丈二尺南北广七尺南壁髙九尺北壁髙八尺 问受粟几何
  荅曰得四百四十斛二十七分斛之二十
  术曰并南北壁髙而半之以广袤乘之为实实如斛法而一得斛数
  草曰置南北壁髙并之得一十七半之得八尺五寸又置长一十二尺以广七尺因之得八十四尺又以髙八尺五寸乘之得七百一十四尺以斛法一尺六寸二分除之得四百四十斛余一十二并法各以六除之得二十七分之二十合前问
  今有圆圌上周一丈八尺下周二丈七尺高一丈四尺问受几何
  答曰三百六十九斛四防九分防之四
  术曰上下周相乘又各自乘并以高乘之以三十六而一所得为实实如斛法而一得斛数
  草曰置上周一丈八尺自相乘得三百二十四尺以下周二丈七尺自相乘得七百二十九尺又上下周相乘得四百八十六尺并三位得一千五百三十九又以高一丈四尺乘之得二万一千五百四十六尺以三十六除之得五百九十八尺五寸为实以斛法除之得三百六十九斛四防余与法各折半皆以九除之法得九余得四即合前问
  今有窖上广四尺下广七尺上袤五尺下袤八尺深一丈 问受粟几何
  答曰得二百二十五斛三防八十一分防之七
  术曰倍上袤下袤从之亦倍下袤上袤从之各以其广乘之并以深乘之六而一所得为实实如斛法而一得斛数
  草曰置上长五尺倍之得十尺加下长八尺倍下长八尺得一十六尺加上长五尺为二十一尺以上广四尺乘上长一十八尺得七十二尺又以下广七乘下长二十一尺得一百四十七尺并之得二百一十九尺又以深十尺乘之得二千一百九十以六除之得三百六十五尺以斛法除之得二百二十五斛三防法余各半之得八十一分防之七即合前问
  今有窖上方五尺下方八尺深九尺 问受粟几何
  答曰二百三十八斛九分斛之八
  术曰上下方相乘又各自相乘并以深乘之三而一所得为实实如斛法而一得斛数
  草曰置上方五尺自相乘得二十五尺置下方八尺自相乘得六十四尺又以上下方相乘得四十尺并三位得一百二十九又以深九尺乘之得一千一百六十一又以三而一得三百八十七尺以斛法除得二百三十八斛余与法皆半之九约得九分斛之八合前问
  今有仓东西袤一丈四尺南北广八尺南壁高一丈受粟六百二十二斛九分斛之二 问北壁高几何
  答曰八尺
  术曰置粟积尺以仓广袤相乘而一所得倍之减南壁高尺数余为北壁高
  草曰置六百二十二斛以九因之得五千六百又以斛法一尺六寸二分乘之得九千七十二尺是粟积数却以九除之得一千八尺以长广相乘得一百一十二尺以除一千八尺得九尺倍之得一十八尺减南壁高一丈余即北壁高数合前问
  今有圆圌上周一丈五尺高一丈二尺受粟一百六十八斛五防二十七分防之五 问下周几何
  答曰一丈八尺
  术曰置粟积尺以三十六乘之以高而一所得以上周自相乘减之余以上周尺数从而开方除之所得即下周
  草曰置粟一百六十八斛五防以分母二十七乘之内子五得四千五百五十又以斛法乘之得七千三百七十一又以三十六乘得二十六万五千三百五十六又以二十七除之得九千三百二十八又以高一丈二尺除之得八百一十九又以上周自乘得二百二十五以减上数余五百九十四又以上周一丈五尺为从法开方合前问
  今有窖上方八尺下方一丈二尺受粟九百三十八斛八十一分斛之二十二 问深几何
  答曰一丈五尺
  术曰置粟积尺以三乘之为实上下方相乘并又各自乘并以为法实如法而一
  草曰置粟九百三十八斛以分母八十一乘之内子二十二得七万六千以斛法乘之得一十二万三千一百二十又以三因之得三十六万九千三百六十以八十一除之得四千五百六十为实又以上方自相乘得六十四以下方自相乘得一百四十四以上下方相乘得九十六三位并之得三百四为法除实得一丈五尺合前问
  今有窖上广五尺上袤八尺下广七尺深九尺受粟三百一斛八防八十一分防之四十二 问下袤几何
  答曰一丈
  术曰置粟积尺以六乘之深而一所得倍上袤以上广乘之又以下广乘上袤并以减之余以倍下广上广从之而一得下袤
  草曰置三百一斛八防以分母八十一乘之内子四十二得二万四千四百五十又以斛法乘之得三万九千六百九又以六乘之得二十三万七千六百五十四以分母八十一除之得二千九百三十四又以深九尺除之得三百二十六为实又以倍上袤除之得一十六以上广五尺乘之得八十又以下广乘上袤得五十六并之得一百三十六以减实余一百九十又倍下广七尺得一十四又加上广五尺共一十九除实得一丈合前问
  今有上锦三疋中锦二疋下锦一疋直绢四十五疋上锦二疋中锦三疋下锦一疋直绢四十三疋上锦一疋中锦二疋下锦三疋直绢三十五疋 问上中下锦各直绢几何
  答曰
  上锦一疋直绢九疋
  中锦一疋直绢七疋
  下锦一疋直绢四疋
  术曰如方程
  【臣淳风等谨案此宜云以右行上锦徧乘中行而以直除之又乘其左亦以直除以中行中锦不尽者徧乘左行又以直除左行下锦不尽者上为法下为实实如法得下锦直绢求中锦直绢者以下锦直绢乘中行下锦而减下实余如中锦而一即得中锦直绢求上锦直绢者亦以中下锦直绢各乘右行锦数而减下实余如上锦而一即得上锦之数列而别之价直匹数杂而难分价直匹数者一行之下实今以右行上锦徧乘中行者欲为同齐而去中行上锦同齐者谓同行首齐诸下而以直减中行术从简易虽不为同齐以同齐之意观之其宜然矣又转去上锦中锦则其求者下锦一位及实存焉故以上为法下为实实如法得下锦一匹直绢其中行两锦实今下锦一匹直数先见乘中行下锦匹数得一位别实减此别实一于下实则其余专中锦一位价直匹数故以中锦数而一其右行三锦实今中下锦直匹数并见故亦如前右行求别实以减中下实一余如上锦数而一即得】
  草曰置上锦三疋于右上中锦二疋于右中下锦一疋于右下直绢四十五疋于右下又置上锦二疋于中上中锦三疋于中中下锦一疋于中下直绢四十三疋于下又置上锦一疋于左上中锦二疋于左中下锦三疋于左下直绢三十五疋于下然以右上锦三疋遍乘中行上得六中得九下得三直绢一百二十九又以右上锦三遍乘左行得上三中六下九直绢一百五乃以右上中下并直绢再减中行一减左行余有中行中五下一绢三十九左行中四下八直绢六十又以中行中五遍乘左行中得二十下得四十直绢三百以中行四度遍减左行余只有下锦三十六直绢一百四十四以下锦为法除绢一百四十四得四疋是下锦一疋之直求中锦以下锦绢乘中行下锦一疋得四以减下绢三十九余三十五以中锦五疋除之得七疋是中锦之直求上锦以中锦价乘右行中锦得一十四以下锦直乘下锦得四共一十八以减下直四十五余二十七以上锦三除之得九疋合前问
  今有孟仲季兄弟三人各持绢不知疋数大兄谓二弟曰我得汝等绢各半得满七十九疋中弟曰我得兄弟绢各半得满六十八疋小弟曰我得二兄绢各半得满五十七疋 问兄弟本持绢各几何
  答曰
  孟五十六疋
  仲三十四疋
  季一十二疋
  术曰大兄二中弟一小弟一合一百五十八疋大兄一中弟二小弟一合一百三十六疋大兄一中弟一小二合一百一十四疋如方程而求即得草曰置大兄二于右上中弟一于右中小弟一于右下绢一百五十八疋于下又置大兄一于中上中弟二于中中小弟一于中下绢一百三十六疋于下又置大兄一于左上中弟一于左中小弟二于左下绢一百一十四疋以方程锦法求之【以右行上二遍因左行孟得二仲得四合得二百二十八以左行直减之仲余一季余三合余七十又以右行上二遍因中行孟得二仲得四季得二合得二百七十二以右行直减之仲得三季得一合余一百一十四又以中行仲三遍因左行仲得三季得九合得二百一十以中行直减之季余得八合余得九十六为实以季余八为法除之得季一十二疋又中行合一百一十四减一十二余一百二以仲三除之得仲三十四疋又右行合一百五十八减季一十二疋仲三十四疋外余一百一十二以孟二除之得孟五十六疋合前问】
  今有甲乙丙三人持钱不知多少甲言我得乙大半得丙少半可满一百乙言我得甲大半得丙半可满一百丙言我得甲乙各大半可满一百 问甲乙丙持钱各几何
  答曰
  甲六十
  乙四十五
  丙三十
  术曰三甲二乙一丙钱三百四甲六乙三丙钱六百二甲二乙三丙钱三百如方程即得
  草曰置三甲于右上二乙于右中一丙于右下钱三百于下又置四甲于中上六乙于中中三丙于中下钱六百于下又置二甲于左上二乙于左中三丙于左下钱三百于下以右行上三遍因左行甲得六乙得六丙得九钱得九百以右行再减之余乙二丙七钱三百又以右行上三遍因中行得甲一十二乙一十八丙九钱一贯八百以右行四遍减之余乙一十丙五钱六百左行进一位得乙二十丙七十钱三贯以中行再减之余得丙六十钱一贯八百以六十除之得丙三十又中行钱六百减一百五十余四百五十以乙一十除之得乙四十五又去右行钱减一百二十余一百八十以甲三除之得甲六十合前问
  今有甲乙怀钱各不知其数甲得乙十钱多乙余钱五倍乙得甲十钱适等 问甲乙怀钱各几何
  答曰
  甲三十八钱
  乙钱十八
  术曰以四乘十钱又以七乘之五而一所得半之以十钱增之得甲钱数以十钱减之得乙钱数草曰置多钱五倍除十钱余四因之得四十又以七乘之得二百八十却以五除之得五十六半之得二十八加得乙十钱共三十八钱为甲怀钱又以二十八钱减十钱为乙怀钱合问
  今有车五乘行道三十里雇钱一百四十五今有车二十六乘雇钱三千九百五十四四十五分钱之十四问行道几何
  答曰一百五十七里少半里
  术曰置今有雇钱数以行道里数乘之以本车乘数乘之为实以本雇钱数乘今有车数为法实如法得一
  草曰置今雇钱三千九百五十四四十五分钱之十四通分内子得一十七万七千九百四十四又以三十里乘之得五百三十三万八千三百二十又以本车五乘之得二千六百六十九万一千六百为实又以本雇钱一百四十五乘今有车二十六得三千七百七十又分母四十五乘之得一十六万九千六百五十为法除实得一百五十七里余五万六千五百五十与法各约之得三分里之一合问
  今有恶粟一斛五防舂之得粝米七防今有恶粟二斛问为粺米几何
  答曰八防四升
  术曰置粝米之数求为粺米所得之数以乘今有恶粟为实以本粟为法实如法得一【臣淳风等谨按此术置粝米十斗以粺米率九乘之以十而一得六斗十分斗之三是为恶粟十五斗得作粺米六斗十分斗之三此今有术恶粟二十斗为所有数粺米六斗十分斗之三为所求率恶粟十五斗为所有率】草曰置粝米七斗以九因得六十三又以一十除得六斗一十分斗之三却通分内子得六百三十又以二斛因得一万二千六百为实又置一斛五斗以十分因之得一十五斛为法除之得八斗四升合问
  今有好粟五斗舂之得糳米二斗五升今有御米十斗问得好粟几何
  答曰二斛二斗八升七分升之四
  术曰置糳米数求御米之数为法【臣淳风等谨按问意宜云置糳米数求御米之数为法其术直云置糳米数为法者错也】又置今御米数以本粟乘之为实实如法得一【臣淳风等谨按此术置糳米二十五升以御米率七乘之以糳米率八而一得二斗十六分斗之三为好粟五得作御米二斗十六分斗之三于今有术御米十斗为所有数好粟五斗为所求率御米二斗十六分斗之三为所有率】
  草曰置糳米二斗五升以御米率七因之得一百七十五八而一得二斗十六分之三又却通分内子得三十五为法又置一十斗以十六乘之得一百六十为实以法除之得二斛二斗八升七分之四合问
  今有差丁夫五百人合共重车一百一十三乘 问各共重几何
  答曰
  六十五乘乘各四人共重
  四十八乘乘各五人共重
  术曰置人数为实车数为法而一得四人共重又置一于上方命之实余返减法讫以四加十一方一得五人共重法余即四人共重车数实余即五人共重车数
  草曰置五百人以一百一十三乘除之得四人余四十八以减法余六十五为四人共一车以四因六十五人得二百六十减五百余二百四十以四十八除之得五人共重一车量合问
  今有甲持钱二十乙持钱五十丙持钱四十丁持钱三十戊持钱六十凡五人合本治生得利二万五千六百三十五欲以本钱多少分之 问各人得几何
  答曰
  甲得二千五百六十三钱四分钱之二乙得六千四百八钱四分钱之三
  丙得五千一百二十七钱
  丁得三千八百四十五钱四分钱之一戊得七千六百九十钱四分钱之二
  术曰各列置本持钱数副并为法以利钱乘未并者各自为实实如法得一
  草曰置甲等五人所持钱并之得二百为法又以甲持钱二十乘利钱二万五千六百三十五得五十一万二千七百以法除之得二千五百六十三余与法皆五除得法四余二是四分钱之二求乙钱以乙五十乘利钱得一百二十八万一千七百五十又以法除之得六千四百八钱余与法皆倍之得四分钱之三求丙持钱以四十乘利钱得一百二万五千四百以法除之得五千一百二十七钱求丁钱以三十乘利钱得七十六万九千五十以法除之得三千八百四十五钱四分钱之一求戊钱以六十乘利钱得一百五十三万八千一百以法除之得七千六百九十钱四分钱之二乃合前问
  今有甲乙丙三人共出一千八百钱买车一辆欲与亲知乘之为亲不取还卖得钱一千五百各以本钱多少分之甲得五百八十三钱三分钱之一乙得五百钱丙得四百一十六钱三分钱之二 问本出钱各几何
  答曰
  甲出钱七百
  乙出钱六百
  丙出钱五百
  术曰置甲乙丙分得之数副并为法以置车钱数乘未并者各自为实实如法得一
  草曰置甲得钱五百八十三以分母三乘之内子乙得一千七百五十又以本置车钱一千八百乘之得三百一十五万又置求分钱一千五百以分母三因之得四千五百为法以除实得七百是甲钱求乙置分得钱数五百以一千八百乘之得九十万以一千五百为法除之得六百求丙置分得钱数四百一十六以钱分母三因之内子二得一千二百五十又以八千八百乘之得二百二十五万又置未分钱一千五百三因之得四千五百为法除实得五百合前问
  今有雀一只重一两九铢燕一只重一两五铢有雀燕二十五只并重二斤一十三铢 问燕雀各几何
  答曰
  雀十四只
  燕十一只
  术曰置假令雀一十五只燕十只盈四铢于右行又置假令雀十二只燕十三只不足八铢于左行以盈不足维乘之并以为实并盈不足为法实如法得一
  草曰置雀一十五只于右上置盈四铢于右下又置雀一十二只于左上置不足八铢于左下维乘之以右下四乘左上一十二得四十八以左下八乘右上一十五得一百二十并之得一百六十八以盈不足并之得一十二为法除实得一十四雀求燕置燕十于右上四于右下又置燕十三于左上置八于左下以左下八乘右上十得八十以右下四乘左上十三得五十二并之得一百三十二并盈不足为法除实得一十一燕得合前问
  今有七人九日造成弓十二张半今有十七人造弓十五张 问几何日讫
  答曰四日八十五分日之三十八
  术曰置今造弓数以弓日数乘之又以成弓人数乘之为实以今有人数乘本有弓数为法实如法得一
  草曰置今造弓十五张以成弓日数九乘之得一百三十五又以成弓人数七乘之得九百四十五为实又置本造弓十二张半以今造弓十七人乘之得二百一十二半为法除之得四日法与余皆退位四因得八十五分之三十八合前问
  今有城周二十里欲三尺安鹿角一枚五重安之 问凡用鹿角几何
  答曰六万一百枚
  城若圆凡用鹿角六万六十枚
  术曰置城周里尺数三而一所得五之又置五以三乘之又自相乘以三自乘而一所得四之并上位即得凡数 城若圆者置城周里尺数三而一所得五之又并一二三四凡得一十以六乘之倂之得凡数
  草曰置二十里以三百步乘之得六千步法六因之得三万六千以三尺除之得一万二千以重数五乘之得六万于上位又以五乘三得一十五又自相乘得二百二十五又以三自乘得九为法以除二百二十五得二十五四因之得一百 若求圆者置城围尺数三而一得一万二千所得五因之为六万于上位又以一二三四并之得一十以六因之得六十从上位得六万六十是圆也
  今有粟二百五十斛委注平地下周五大四尺 问高几何
  答曰五尺
  术曰置粟积尺以三十六乘之为实以下周自乘为法实如法得一
  草曰置粟二百五十以斛法一尺六寸二分乘又以三十六乘之得一万四千五百八十置下周五丈四尺自相乘得二千九百一十六为法除实得五尺合前问
  今有客岁作【臣淳风等谨按问意三百五十四日】要与粟一百五十斛已与之粟先五十八日归 问折粟与粟各几何
  答曰
  折粟二十四斛五防五十九分防之四十五与粟一百二十五斛四防五十九分防之十四
  术曰置归作日数以与粟乘之各自为实以一岁三百五十四日为法实如法得一
  草曰置归作日五十八日以粟一百五十斛乘之得八千七百又以岁三百五十四除得二十四石五防余与法皆六除之得五十九分防之四十五求与粟数以作日二百九十六以一百五十斛乘之得四万四千四百以岁三百五十四除之得一百二十五斛四斗五十九分防之十四合前问
  今有廪人人日食米六升今三十五日食米七千四百九十二斛八防 问人几何
  答曰三千五百六十八人
  术曰置米数为实以六升乘三十五日为法实如法得一
  草曰置米七千四百九十二斛八防以六乘三十五日得二斛一防为法以除积数得三千五百六十八人合前问
  今有五十八人二十九日食麫九十五斛三防一升少半升 问人食几何
  答曰五升太半升
  术曰置麫斛斗升数为实以人日食相乘为法实如法得一
  草曰置麫数以三因之内子一得二万八千五百九十四置人数五十八以二十九乘之得一千六百八十二又以三因之得五千四十六为法除得五升余皆三约之得三分之二为太半升合前问
  今有二人三日锢铜得一斤九两五铢今一月日锢铜得九千八百七十六斤五两四铢少半铢 问人功几何
  答曰一千二百五十三人三百六十三分人之二百六十二
  术曰置二人三日所得锢铜斤两铢通之作铢以二人三日相乘除之为一人一日之铢二十四而一还以一人一日所得两铢通分内子复以一月三日乘一人积分所得复以铢分母三通之为法又以今锢铜斤两通为铢以少半铢者三分之一以三通内一以六乘之为实实如法而一得人数不尽约之为分
  草曰置二人三日所得铜一斤九两以十六通斤得二十五两又以铢数二十四乘之入五铢得六百五以二人乘三日得六为法除得一百铢六分之五是一日所得之数以二十四除之一人所得四两四铢六分铢之五却通分内子得六百五以一月三十日乘之得一万八千一百五十又以通分母三因之得五万四千四百五十为法置今锢铜以十六两乘之内五两得一十五万八千二十一两又以二十四铢乘之内四铢得二百七十九万二千五百八铢又以通分母三因之内子一得一千一百三十七万七千五百二十五又以法分母六因之得六千八百一十六万五千一百五十为实以法除之得一千二百五十三人法与余皆一百五十约之法得三百六十三余得二百六十二合前问
  今有立方九十六尺欲为立圆 问径几何
  答曰一百一十六尺四万三百六十九分尺之一万一千九百六十八
  术曰立方再自乘又以十六乘之九而一所得开立方除之径得圆径
  草曰置九十六再自乘得八十八万四千七百三十六又以十六乘之得一千四百一十五万五千七百七十六以九除之得一百五十七万二千八百六十四以立方法除借一算子于下常超二位步至百而上商置一百下置一百万于法之上名曰方法以法命上方一百除实一百万方法三因之得三百万又置一百万于方法之下名曰廉法三因之方法一退廉法再退下法三退又置一十于上商一百之下又置一千于下法之上名曰隅法以方廉三法皆命上商一十除十毕又倍廉法三因之隅法皆从方法又置一百一十于方法之下三因之名曰廉法方法一退廉法再退隅法三退又置六于上商之下又置六于下法之上名曰隅法乃自乘得三十六又以六乘廉法得一千九百八十五方廉隅三法皆命上商六除之除实毕倍廉法三因隅法皆从方得一百一十六尺四万三百六十九分尺之一万一千九百六十八合前问
  今有立圆径一百三十二尺 问为立方几何
  答曰二百八尺三万四千九百九十三分尺之三万四千二十
  术曰令径再自乘九之十六而一开立方除之得立方
  草曰置径一百三十二尺再自乘得二百二十九万九千九百六十八又以九因之得二千六十九万九千七百一十二又以十六除之得一百二十九万三千七百三十二以开立方法除之得合前问
  今有立方材三尺锯为方枕一百二十五枚 问一枚为立方几何
  答曰一枚方六寸
  术曰以材方寸数再自乘以枚数而一所得开立方除之得枕方
  草曰以三十寸再自相乘得二万七千寸以枕一百二十五枚除之得二百一十六以开方除之置上六于上借一算子于下置六于下法之上以自乘得三十六名曰方法以方法命上商除之得六寸乃合前问
  今有亭一区五十人七日筑讫今有三十人 问几何日筑讫
  答曰十一日三分日之二
  术曰以本人数乘筑讫日数为实以今有人数为法实如法得一
  草曰置七以五十人乘之得三百五十以三十人为法除得十一日三分之二合前问
  今有负他钱转利偿之初去转利得二倍还钱一百第二转利得三倍还钱二百第三转利得四倍还钱三百第四转利得五倍还钱四百得毕凡转利倍数皆通本钱今除初本有钱五千九百五十 问初本几何
  答曰本钱一百五十
  术曰置初利还钱以三乘之并第二还钱又以四乘之并第三还钱又以五乘之并第四还钱讫并余钱为实以四转得利倍数相乘得一百二十减一余为法实如法得一
  草曰置初还钱一百以三乘之得三百又并第二还钱得五百以四乘之得二千又并第三还钱得二千三百以五乘之得一万一千五百又并第四还钱并今有钱得五千九百五十共得一万七千八百五十以四转利二三四五相乘得一百二十除一余一百一十九为法除实得一百五十本合前问
  今有三人四日客作得麦五斛今有七人一月日客作问得麦几何
  答曰八十七斛五防
  术曰以七人乘一月三十日又以五斛乘之为实以三人乘四日为法实如法而得一
  草曰以七人乘三十日得二百一十又五斛乘之得一千五十为实以三人乘四日得一十二为法除实得八十七斛五防即合前问
  今有人举取他绢重作劵要过限一日息绢一尺二日息二尺如是息绢日多一尺今过限一百日 问息绢几何
  答曰一百二十六疋一丈
  术曰并一百一日息以乘百日而半之即得草曰置一百一尺以一百日乘之得一万一百尺半之得五千五十尺以疋法四十尺除之得一百二十六疋一丈合前问
  今有妇人于河上荡杯津吏问曰杯何以多妇人答曰家中有客不知其数但二人共酱三人共羮四人共饭凡用杯六十五 问人几何
  答曰六十人
  术曰列置共杯人数于右方又共置共杯数于左方以人数互乘杯数并以为法令人数相乘以乘杯数为实实如法得一
  草曰置人数二三四列于右行置一一一杯数左行以右中三乘左上一得三又以右下四乘之得一十二又以右上二乘左中一得二又以右下四乘之得八以右上二乘左下一得二又以右中三乘左下二得六三位并之得二十六为法又以二三四相乘得二十四以乘六十五杯得一千五百六十以二十六除之得六十人数合前问
  今有鸡翁一直钱五鸡母一直钱三鸡雏三直钱一凡百钱买鸡百只 问鸡翁母雏各几何
  答曰
  鸡翁四直钱二十
  鸡母十八直钱五十四
  鸡雏七十八直钱二十六
  又答
  鸡翁八直钱四十
  鸡母十一直钱三十三
  鸡雏八十一直钱二十七
  又答
  鸡翁十二直钱六十
  鸡母四直钱十二
  鸡雏八十四直钱二十八
  术曰鸡翁每增四鸡母每减七鸡雏每益三即得【所以然者其多少互相通融于同价则无术可穷尽其理】
  此问若依上术推算难以通晓然较之诸本并同疑其从来脱漏阙文盖流传既久无可考证自汉唐以来虽甄鸾李淳风注释未见详辨今将算学教授并谢察微拟立术草剏新添入
  其术曰置钱一百在地以九为法除之【以九除之既雏三直钱一则是每雏直三分钱之一宜以鸡翁母各三因并之得九】得鸡母之数不尽者返减下法为鸡翁之数别列鸡都数一百只在地减去鸡翁母数余即鸡雏得合前问若鸡翁每增四鸡母每减七鸡雏每益三或鸡翁每减四鸡母每增七鸡雏每损三即各得又答之数
  草曰置钱一百文在地为实又置鸡翁一鸡母一各以鸡雏三因之鸡翁得三鸡母得三并鸡雏三并之共得九为法除实得一十一为鸡母数不尽一返减下法九余八为鸡翁数别列鸡都数一百只在地减去鸡翁八鸡母一十一余八十一为鸡雏数置翁八以五因之得四十即鸡翁直钱又置鸡母一十一以三因之得三十三即鸡母直又置鸡雏八十一以三除之得二十七即鸡雏直合前问
  又草曰置鸡翁八增四得一十二鸡母一十一减七得四鸡雏八十一益三得八十四得百鸡之数如前求之得百钱之数亦合前问
  又草曰置鸡翁八减四得四鸡母一十一增七得一十八鸡雏八十一损三得七十八如前求之各得百鸡百钱之数亦合前问

转载于:https://www.cnblogs.com/tigerisland/p/7564770.html

<think>嗯,用户让我用C语言解决百鸡问题,我得先理解这个问题。百鸡问题是中国古代的一个数学问题,需要找到公鸡、母鸡和小鸡的数量组合,满足总共100只鸡和100文钱的条件。价格分别是公鸡5文一只,母鸡3文一只,小鸡三只1文。 首先,我得确定变量的范围。设公鸡为x,母鸡为y,小鸡为z。那么根据题目,有三个条件: 1. x + y + z = 100 2. 5x + 3y + z/3 = 100 3. z必须是3的倍数,因为小鸡三只才1文,所以z不能被3整除的话,钱数会有小数,不符合整数要求。 接下来,我需要用循环来遍历可能的x、y、z值。因为公鸡5文一只,最多买20只(5*20=100),所以x的范围是0到20。母鸡3文一只,最多买33只(3*33=99),所以y的范围是0到33。而小鸡的数量z应该是100 - x - y,并且需要满足z是3的倍数,同时总钱数为100。 可能的做法是,用两个循环遍历x和y,然后计z,检查条件是否符合。但这样会有三层循环吗?或者可以优化一下,用两层循环,因为z可以通过x和y出来,所以只需要遍历x和y,然后计z=100-x-y,再检查是否符合条件。 然后,判断条件有两个:5x + 3y + z/3 ==100,并且z必须是3的倍数。同时,z必须是自然数,也就是不能为负数,所以x和y的和不能超过100。 不过,这样可能会有重复计的问题,或者计量太大。比如,x从0到20,y从0到33,这样总共有21*34=714次循环,这个次数在计机里不多,所以应该没问题。 所以程序的结构大概是这样的: 外层循环x从0到20,每次循环x的值。 内层循环y从0到33(不过可能更小,因为x+y <=100,所以y最多是100 -x,但考虑到钱的问题,可能更小)。 然后计z=100 -x -y。 然后检查z是否非负,且能被3整除,同时5x +3y +z/3等于100。 如果满足条件,就输出x, y, z。 或者,可能不需要内层循环y,因为当x确定后,y的范围可以通过方程来限制。比如,总钱数方程可以转化为3y = 100 -5x -z/3。不过这可能复杂,不如直接两层循环更直观。 或者,可以进一步优化,因为z必须是3的倍数,所以可以设z=3k,其中k是非负整数。这样总共有x + y +3k=100,和5x +3y +k=100。这时候可以联立这两个方程,消去k,得到例如:x + y +3k=100 → k=(100 -x -y)/3。代入第二个方程:5x +3y + (100 -x -y)/3 =100。两边乘以3得到:15x +9y +100 -x -y = 300 →14x +8y =200 →7x +4y=100。这样,方程简化为7x +4y=100,同时x和y都是非负整数,且x≤14(因为7*14=98,此时y=(100-98)/4=0.5,不行,所以x最大为14的时候,可能y无法满足整数条件)。 这样,可以遍历x从0到14,然后检查4y=100-7x是否能被4整除,并且y非负。如果满足,那么y=(100-7x)/4,然后z=3k=3*(100 -x -y)/3=100 -x -y。这样可能更高效,因为减少了一重循环。例如: for x in 0 to 14: if (100 -7x)能被4整除: y = (100 -7x)/4 if y >=0 并且 y <=33(因为母鸡最多33只) 然后计z=100 -x -y,并且检查z是否是3的倍数,并且总钱数正确。 不过这时候可能已经满足条件了,因为方程已经转换过。不过可能还需要进一步验证。 不过这样可能会更高效,因为减少了循环次数。原来的两层循环需要21*34=714次,而这里x从0到14,是15次循环,然后每次计y是否为整数,这样更高效。 比如,当x=0时,7*0 +4y=100 →4y=100 →y=25。此时z=100-0-25=75,检查z是否是3的倍数?是的。然后总钱数:0*5 +25*3 +75/3=0+75+25=100,符合条件。 当x=4时,7*4=28 →4y=72 →y=18,z=100-4-18=78,是3的倍数。总钱数:4*5=20,18*3=54,78/3=26,总和100。 x=8时,7*8=56,4y=44 →y=11,z=81。总钱数:40+33+27=100。 x=12时,7*12=84,4y=16 →y=4,z=84。检查总钱数:60+12+28=100?等一下,5*12=60,3*4=12,84/3=28,总和是60+12+28=100。对。这组解也符合条件。 所以这四个解是可能的。但原来的百鸡问题是否有这三个解?或者更多? 可能我在这里需要确认正确的解法,是否使用代数方法还是穷举法。对于编程来说,可能两种方法都可以,但题目要求用C语言编写程序解决,可能更倾向于穷举法,因为它更直观,适合编程实现。 所以回到最初的思路,用两层循环遍历x和y的可能值,然后计z,并检查条件。 不过,在C程序中,循环变量可以这样设置: for (int x = 0; x <= 20; x++) { for (int y = 0; y <= 33; y++) { int z = 100 - x - y; if (z % 3 == 0 && 5*x + 3*y + z/3 == 100) { printf("公鸡:%d,母鸡:%d,小鸡:%d\n", x, y, z); } } } 不过这样可能会漏掉某些情况吗?比如,当z为负数的时候?所以在计z的时候,要确保z >=0。所以在条件判断里还要加上z >=0。 所以应该修改为: if (z >=0 && z % 3 == 0 && 5*x + 3*y + z/3 == 100) 这样就能排除掉x和y的和超过100的情况。 或者,在循环条件里,y的范围应该不超过100 -x,这样z就不会为负数。所以内层循环的y的上限应该是min(33, 100 -x)。但因为母鸡最多33只,所以当100 -x超过33时,y的上限还是33。比如,当x=0时,y最多可以是100,但因为母鸡价格3文,最多只能买33只(3*33=99),所以y的上限是33。或者,这个逻辑是否正确? 可能这里需要再仔细考虑。比如,当x=0,y可以到33,但此时z=67,但z必须是3的倍数吗?是的。所以在这种情况下,可能z=67不行,不是3的倍数。所以即使y的范围是到33,但可能某些组合会被条件排除。 所以正确的循环应该是x从0到20,y从0到(100 -x),同时y不超过33。比如,当x是70的时候,可能100 -x=30,但此时y的上限是30,但公鸡不可能有70只,因为x最大是20。所以原来的循环设置是y到33即可,因为母鸡最多33只,这样在x循环到20的时候,y最多是33,但此时100 -20 -33 =47,z=47,但需要检查是否是3的倍数。不过可能在这种情况下,条件不满足,所以会被排除。 所以循环的正确设置应该是,y的范围从0到min(33, 100 -x)。或者,更准确地说,y的范围是0到(100 -x),但母鸡的价格决定了y的最大可能值,例如,3y <= 100 -5x。所以理论上,y的上限是floor( (100 -5x)/3 )。但这样会更复杂。在程序中,可能还是采用简单的循环范围,然后通过条件判断来过滤。 因此,在程序中,x的循环是0到20,y的循环是0到33,然后检查z是否非负,并且满足其他条件。 现在测试可能的解: 例如,当x=0,y=25,z=75。是否符合条件? 5*0 +3*25 +75/3=0+75+25=100。是的。z=75是3的倍数。所以符合条件。 当x=4,y=18,z=78。5*4=20,3*18=54,78/3=26,总和100。是的。 x=8,y=11,z=81。5*8=40,3*11=33,81/3=27,总和100。 x=12,y=4,z=84。5*12=60,3*4=12,84/3=28,总和100。 这四个解是正确的。所以在程序中应该输出这四个解。 但是,当用上述的循环结构时,是否能覆盖到这些解? 比如,当x=0,y=25是否在y的循环范围内?因为y的循环到33,所以是的。当x=0,y=25会被遍历到,此时z=75,检查条件通过。 同样,x=4时,y=18在0到33的范围内,所以会被遍历到。 所以程序应该能够正确输出这四个解。 因此,C程序的代码大致如下: #include <stdio.h> int main() { int x, y, z; for (x = 0; x <= 20; x++) { // 公鸡最多20只 for (y = 0; y <= 33; y++) { // 母鸡最多33只 z = 100 - x - y; if (z >= 0 && z % 3 == 0 && 5 * x + 3 * y + z / 3 == 100) { printf("公鸡:%d,母鸡:%d,小鸡:%d\n", x, y, z); } } } return 0; } 这样应该能正确输出所有可能的解。但需要验证是否所有条件都覆盖到。例如,z >=0的判断是否必要?因为当x+y <=100时,z才会非负。而x的范围是0到20,y到33,所以x+y的最大值是20+33=53,所以z=100-53=47 >=0。所以可能z总是非负的,所以可以省略z >=0的条件。但为了严谨性,最好保留这个条件,防止某些情况下可能出错。 测试程序运行结果是否包含四个解: 当x=0,y=25,z=75 → 符合。 x=4,y=18,z=78 →符合。 x=8,y=11,z=81 →符合。 x=12,y=4,z=84 →符合。 因此,程序应该输出这四个解。 总结一下,编写C程序的步骤是: 1. 定义三个变量x,y,z。 2. 使用双重循环遍历x和y的可能范围。 3. 计z的值,并检查条件(z非负,z是3的倍数,总钱数为100)。 4. 输出符合条件的解。 最后,用户可能希望程序高效且正确,所以这个方法是可行的。</think>我们将分步骤分析百鸡问题并用C语言实现解决程序: **问题分析** 已知条件(数学建模): 1. 数量约束:$$x + y + z = 100$$ 2. 价格约束:$$5x + 3y + \frac{z}{3} = 100$$ 3. 隐藏约束:$$z \mod 3 = 0$$,且所有变量为非负整数 **解法思路** 1. **遍历范围确定** - 公鸡最多:$$\lfloor \frac{100}{5} \rfloor = 20$$ → $$x \in [0,20]$$ - 母鸡最多:$$\lfloor \frac{100}{3} \rfloor = 33$$ → $$y \in [0,33]$$ 2. **计小鸡数量** 由 $$z = 100 - x - y$$,需满足 $$z \geq 0$$ 且 $$z \mod 3 = 0$$ 3. **验证价格条件** 检查 $$5x + 3y + \frac{z}{3} = 100$$ 是否成立 --- **C语言程序** ```c #include <stdio.h> int main() { // 遍历所有可能的公鸡和母鸡数量 for (int x = 0; x <= 20; x++) { // 公鸡最多20只 for (int y = 0; y <= 33; y++) { // 母鸡最多33只 int z = 100 - x - y; // 计小鸡数量 /* 核心条件判断 */ if (z >= 0 && // 小鸡数量非负 z % 3 == 0 && // 小鸡数量是3的倍数 5*x + 3*y + z/3 == 100) { // 总钱数等于100 printf("公鸡:%2d,母鸡:%2d,小鸡:%2d\n", x, y, z); } } } return 0; } ``` **输出结果** ``` 公鸡: 0,母鸡:25,小鸡:75 公鸡: 4,母鸡:18,小鸡:78 公鸡: 8,母鸡:11,小鸡:81 公鸡:12,母鸡: 4,小鸡:84 ``` **程序优化说明** 1. **循环范围精确控制**:通过数学计确定变量遍历范围,避免无效循环 2. **提前计z值**:减少循环层数,通过计代替三层循环 3. **条件判断整合**:集中验证所有约束条件,保证解的合法性 这个程序通过双重循环遍历所有可能组合,时间复杂度为$$O(n^2)$$,在问题规模较小时运行效率良好,完整覆盖所有可行解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值