6-1 鸡兔同笼问题 (20分)
孙子算经》记载:“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”
函数原型
int ChickenRabbit(int *chicken, int *rabbit, int head, int foot);
说明:head 和 foot 是头和脚的数量,chicken 和 rabbit 是指示鸡和兔数量的指针。若问题有解,则将鸡和兔的数量保存到 chicken 和 rabbit 所指示的变量中,函数值为1(真);否则不改变 chicken 和 rabbit 所指示的变量,函数值为0(假)。
#include <stdio.h>
int ChickenRabbit(int *chicken, int *rabbit, int head, int foot);
int main()
{
int h, f, c, r;
scanf("%d%d", &h, &f);
if (ChickenRabbit(&c, &r, h, f))
{
printf("%d %d\n", c, r);
}
else
{
puts("None");
}
return 0;
}
/* 你的提交代码将被嵌在这里 */
这里有两种方法:
- 数学函数法( 不推荐)
这里我们用数学公式来表示鸡兔的个数,最后通过判断公式中求解的值是否为整数来决定输出结果,今天我在PTA 的上机练习中就遇到了这种情况的问题(而老师给我的解释是要考虑的数学情况有很多),比如:
给定的头的个数不能比脚多;
当用公式求得的值为负值时便不能正常输出( 属于bug)
我写的代码如下:
int ChickenRabbit(int *chicken, int *rabbit, int head, int foot)
{
int m,n;
m=(foot-2*head)/2;//相当于数学公式中的运算,可以设m,n来表示
n=head-m;
if((foot-2*head)/2==(foot-2*head)*1.0/2)//判断公式计算的值是否为整数
{
*rabbit=m;
*chicken=n;
return 1;
}
else
{
return 0;
}
}
2.循环遍历法
int ChickenRabbit(int *chicken, int *rabbit, int head, int foot)
{
int i;
for(i=0;i<head;i++)//与上面的区别在于是将兔的个数从0到head逐个试
{
if(2*i==(foot-2*head))
{
*rabbit=i;
*chicken=head-i;
break;
}
}
if(i<=head)//另外需要考虑好是由break结束查值还是用<=head来查值
return 1;
else
return 0;
}