当前位置:首页 » 编程语言 » c语言中枚举法解决鸡兔同笼
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言中枚举法解决鸡兔同笼

发布时间: 2022-06-25 19:53:09

‘壹’ 关于鸡兔同笼的解决问题用方法

说起“鸡兔同笼”就要说起1500年前的《孙子算经》里面的经典题目(传到日本变成了”龟鹤问题“),我们就从这道题目入手,书中是这样叙述的:“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”这四句话的意思是:有若干只鸡兔同在一个笼子里,从上面数,有35个头;从下面数,有94只脚.求笼中各有几只鸡和兔?


解决“鸡兔同笼”问题的第一种方法:枚举法(列表法)。

方法很简单过程很复杂,就是根据不断变化鸡和兔的数量,分别把鸡和兔子的腿的的数量填入表格中,知道找到正确的答案为止,这种方法只适合与课堂教学中的探索和对其他方法的引导,由于这种方法太过笨拙,用时较多,在日常的练习和考试中一般不适用。所以这种方法大家了解即可。


解决“鸡兔同笼”问题的第二种方法:假设法(矛盾法)。

这种解决“鸡兔同笼”问题的主要解决方法之一,该方法主要是根据题目当中的已知条件,对题目进行某种假设,然后按照条件进行推理,找到与题目数量的矛盾之处,最后进行合理的变化从而得出正确的结论。同时呢,假设法也是奥数题目中经常遇到的方法(这里仅对于鸡兔同笼问题进行讲解,其他问题的假设法这里暂时不再赘述),这种方法关键是——通过假设找到与题目中的数量出现的矛盾之处。

我们首先看题目:有若干只鸡兔同在一个笼子里,从上面数,有35个头;从下面数,有94只脚。求笼中各有几只鸡和兔?

思考过程:假设笼子里面35只全是兔子的话,那么脚的总数应该是:35×4=140(只),但是实际笼子里只有94只脚,这就与我们假设的出现矛盾了,多出了140-94=46只脚,为什么会多出46只脚呢?因为笼子里不全是兔子还有鸡,我们把两只脚的鸡假设成了兔子(现实中一只兔子比一只鸡多两只脚),由于我们的假设而多出了46只脚,多2条腿就有1只鸡,那么多出的46只腿当中有多少个2,就有多少只鸡,我们就用46÷2=23(只),求出了鸡的数量,再用35-23=12(只)得出兔子的数量。

我们总结算式:鸡的数量=(35×4-94)÷(4-2)=23(只)

兔子的数量=35-23=12(只)

归纳公式:如果假设全是兔子:(总头数×一只兔子脚的数量-总脚数)÷(一只兔子脚的数量-一只鸡的脚的数量)

当然,我们还可以假设笼子里全是鸡,如果全是鸡,脚的总数是35×2=70(只)脚,与实际少了94-70=24(只)脚,由于一直鸡比一只兔子少两只脚,每少两只脚就有一只兔子,少24只脚就有:24÷2=12(只)兔子,算出兔子数量,鸡的数量就是:35-12=23(只)。

列出算式:兔子的数量=(94-35×2)÷(4-2)=12(只)

鸡的数量=35-12=23(只)

归纳公式:如果假设全是鸡:(总脚数-总头数×一只鸡脚的数量)÷(一只兔子脚的数量-一只鸡的脚的数量)

‘贰’ c语言算法,鸡兔同笼

已知鸡和兔的总数量为n,总腿数为m,输入n和m,依次输出鸡的数目和兔的数目。如果无解则输出No answer。

输入:

两个整数b和m,如上所述。

输出:

鸡的数目和兔的数目。

我们假设a = 鸡只数,b = 兔只数(兔的脚数×总只数-总脚数)÷(兔的脚数-鸡的脚数)=鸡的只数,a = ( 4*n - m )/2。

总只数-鸡的只数=兔的只数,b = n - a。

具体代码:

#include "stdio.h"

int main() {

int a,b,n, m;

// a鸡的数量

// b兔的数量

// n鸡兔总数

// m总脚数

scanf("%d %d", &n,&m);

a = (4 * n - m) / 2;//算出鸡的数量

b = n - a;//算出兔的数量

if (a <= 0 || b <= 0) {

//结果小于等于0,答案不成立,无解

printf("No answer");

} else {

//结果大于0

printf("%d %d", a, b);

}

return 0;

}

(2)c语言中枚举法解决鸡兔同笼扩展阅读:

鸡兔同笼解题思路:如果先假设它们全是鸡,于是根据鸡兔的总数就可以算出在假设下共有几只脚,把这样得到的脚数与题中给出的脚数相比较,看看差多少,每差2只脚就说明有1只兔,将所差的脚数除以2,就可以算出共有多少只兔。

概括起来,解鸡兔同笼题的基本关系式是:兔数=(实际脚数-每只鸡脚数×鸡兔总数)÷(每只兔子脚数-每只鸡脚数)。类似地,也可以假设全是兔子。

‘叁’ 鸡兔同笼的问题 c语言怎么样编写

输入说明:
输入为两个正整数,第一个为
M
的值,第二个为
N
的值,用空格分隔。
输出说明:
若有解,输出两个整数,用空格分隔,第一个代表鸡的只数,第一个代表兔子的只数;若无解,直接输出一个
0。
算法:以列举法写程序,让计算机从鸡为0开始执行计算,利用循环语句计算大量次数后,得出最终结果。
具体程序为:
#include
int
main()
{int
chicken,rabbit;//鸡,兔子
int
M,N;//头,脚
printf("M=,N=");
scanf("%d
%d",&M,&N);
for(chicken=0;chicken<=M;chicken++)//鸡的数量从0到总头数M尝试
{if(chicken*2+rabbit*4==N)//如果总脚数与输入的总脚数相同
{printf("%d
%d",chicken,rabbit);//分别输出鸡、兔
return
0;//停止程序}}//for执行完表示找不到
printf("0");return
0;}
(3)c语言中枚举法解决鸡兔同笼扩展阅读:
鸡兔同笼问题算法有很多种,编写出的程序不尽相同。下面列举几种算法,编写程序会更为简单一些。
有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?
(1)假设全是鸡:2×35=70(只),鸡脚比总脚数少:94-70=24
(只)
兔子比鸡多的脚数:4-2=2(只),兔子的只数:24÷2=12
(只),鸡的只数:35-12=23(只)
假设全是兔子:4×35=140(只),兔子脚比总数多:140-94=46(只)
兔子比鸡多的脚数:4-2=2(只),鸡的只数:46÷2=23(只),兔子的只数:=35-23=12(只)(2)设鸡有x只,兔有y只。
解得
参考资料:鸡兔同笼(一种数学奥数题目)_网络

‘肆’ c语言解决鸡兔同笼问题

多次修改后面有个精减版的
#include

void
main(
)
{
int
ret
=
0;
//
表示最后一个printf的返回值
while(1)
{
int
h,f,c,r;
printf("请输入头的数目:");
scanf("%d",&h);
printf("\n请输入脚的数目(必须为偶数):");
scanf("%d",&f);
while(f%2!=0
&&
f
!=
0
)
//加上一个输入0值继续的条件,这里的while
循环可以不要了,后面的两个循环,再加上if的判断条件,已经解决了这里不为偶数的问题(个人认为,验证过了)
{
printf("\n输入脚的数目为奇数,请重新输入脚的数目(必须偶数):");
scanf("%d",&f);
}
while(f<2*h
&&
h!=
0)//同上
{
printf("\n输入脚的数目过小,请输入脚的数目(必须偶数):");
scanf("%d",&f);
/*
在这里加上
if(
f
%2
!=
0)
continue;
*/
/*作用是输入的不是偶数,就要重新输入
*/
}
while(f>4*h&&h!=0)//同上
{
printf("\n输入脚的数目过大,请输入脚的数目(必须偶数):");
scanf("%d",&f);
/
*
if(
f
%
2
!=
0)
continue;
*/
/*作用同上*/
}
for(c=0;c<=h;c++)
for(r=1;r<=h;r++)
//这句改成:for(r=0;
r
<=
h-c;
r++)好点,减少的循环的次数,加了效率
{
if(c+r==h&&2*c+4*r==f)
ret
=
printf("\n鸡的数目为%d,兔子的数目为%d\n\n",c,r);
}
if(
ret
==
39)
/*作用是输入一次成功后,结束大循环,
可以不要*/
break;
}
}
/***********************************************************************/
#include

void
main(
)
{
int
ret
=
0;
//
表示最后一个printf的返回值
while(1)
{
int
h,f,c,r;
printf("请输入头的数目:");
scanf("%d",&h);
printf("\n请输入脚的数目(必须为偶数):");
scanf("%d",&f);
while(f%2!=0
&&
f
!=
0
&&
h
!=
0)
//这里的不等于的条件可以不加
{
printf("\n输入脚的数目为奇数,请重新输入脚的数目(必须偶数):");
scanf("%d",&f);
if(
f
>
4h
||
f
<
2h)
continue;
}
for(c=0;c<=h;c++)
for(r=1;r<=h;r++)
//这句改成:for(r=0;
r
<=
h-c;
r++)好点,减少的循环的次数,加了效率
{
if(c+r==h&&2*c+4*r==f)
ret
=
printf("\n鸡的数目为%d,兔子的数目为%d\n\n",c,r);
}
if(
ret
==
39)
/*作用是输入一次成功后,结束大循环,
可以不要*/
break;
}
}

‘伍’ c语言编程算鸡兔同笼

#include <stdio.h>

#include <windows.h>

main()

{ unsigned long int a,b,c,d;

printf("这是一个用于算鸡兔同笼的小程序(仅能输入整数,使用回车键切换) 请输入鸡兔的总数");

scanf("%d",&a);

printf(" 请输入鸡兔脚的总数");

scanf("%d",&b);

c=(4*a-b)/2; // 鸡的数目

d=a-c; // 兔的数目

if(c*2+d*4==b) printf("鸡有%ld只 兔有%ld只",c,d); // c和d反了

else printf("同学,我看你给的数有错吧!");

Sleep(100000000)。

‘陆’ C语言编写鸡兔同笼的问题

#include<stdio.h>
int main()
{
int a,b,M,N;
printf("请输入鸡兔的总头数\n");
scanf_s("%d",&a);
printf("请输入鸡兔的总腿数\n");
scanf_s("%d",&b);
scanf_s("%d",&M);
M=(2*a)-(b/2);
printf("鸡的数目为%d只");
scanf_s("%d",&N);
N=(b/2)-(a);
printf("兔的数目为%d只");
return 0;
}
我目前是C语言的新手,目前只会做这一类。如果用的是VS(visual studio)编程的话,scanf后必须加_s,这是VS独有的,其他的编程软件随意。

‘柒’ 想用c语言解答鸡兔同笼,怎么做

代码和运行实况见图:

‘捌’ C语言鸡兔同笼问题

数组定义错误。C语言中不能像这样定义变量a,然后定义数组m[a]。这个错误导致了你程序运算的错误。

修改方法:int m[a],n[a];改为int m[100],n[100];
即不要用变量a,而用一个常数。只要保证输入的a不大于100就可以了。
如果想用变量作为数组的界限长度,要用到动态数组,不能用你现在的这种方法。

‘玖’ 用C语言穷举法编写鸡兔同笼

#包括中
无效的主要()
{
整数鸡,兔;
的printf(“鸡\吨兔\
N”的);
的(鸡=
0;鸡<=
35;鸡+
+)
{
兔子=
35
-
鸡;
如果(8
*兔肉+
2
*鸡==
94)的printf(“%d个\
T%D
\
N”的,鸡,兔);

‘拾’ 用C语言编写鸡兔同笼问题

#include
<stdio.h>
void
main(
)
{
int
ret
=
0;
//
表示最后一个printf的返回值
while(1)
{
int
h,f,c,r;
printf("请输入头的数目:");
scanf("%d",&h);
printf("\n请输入脚的数目(必须为偶数):");
scanf("%d",&f);
while(f%2!=0
&&
f
!=
0
&&
h
!=
0)
//这里的不等于的条件可以不加
{
printf("\n输入脚的数目为奇数,请重新输入脚的数目(必须偶数):");
scanf("%d",&f);
if(
f
>
4h
||
f
<
2h)
continue;
}
for(c=0;c<=h;c++)
for(r=1;r<=h;r++)
//这句改成:for(r=0;
r
<=
h-c;
r++)好点,减少的循环的次数,加了效率
{
if(c+r==h&&2*c+4*r==f)
ret
=
printf("\n鸡的数目为%d,兔子的数目为%d\n\n",c,r);
}
if(
ret
==
39)
/*作用是输入一次成功后,结束大循环,
可以不要*/
break;
}
}