问题:已知鸡、兔的头和脚总数,求分别有多少只鸡和兔?
对于该问题我们可以采用穷举法来计算。
分析:
一只鸡有一个头、两只脚
一只兔子有一个头、四只脚
设鸡有x只,兔有y只,就得到了一个两个方程:
x + y = sum(头)
2*x + 4*y=sum(脚)
由二元一次方程特性可知,当我们知道头和脚的数量时,我们可以得到鸡和兔的数量。
采用代码实现如下:
#include <iostream>
#include <stdbool.h>
using namespace std;
bool handle_chicken_rabbit_num(int *chicken,int *rabbit,int head_num,int foot_num)
{
bool result=false;
int i,temp;
//check input num
if( (head_num<=0)||(foot_num <= 0))
{
cout<<"invalid input num,head_num="<<head_num<<"foot_num="<<foot_num<<endl;
return false;
}
#if 1
for(i=0;i<=head_num;i++)
{
temp = head_num - i;
if(foot_num == 2*i+4*temp)
{
result = true;
*chicken = i;
*rabbit = temp;
break;
}
}
#else
//算法改进版
//chicken + rabbit = head_num <==>chicken*2 + rabbit*2 = head_num*2
//chicken*2 + rabbit*4 = foot_num
//==>rabbit*2 = foot_num - head_num*2
//==>rabbit = (foot_num - head_num*2)/2 关键判断能否整除
//
//temp==0?(rabbit=(foot_num - head_num*2)/2,chicken=head_num-rabbit):return false;
temp=(foot_num - head_num*2)%2;
if (0 == temp)
{
*rabbit=(foot_num - head_num*2)/2;
*chicken=head_num-*rabbit;
result = true;
}
else
{
return result;
}
#endif
return result;
}
int main()
{
int head_num=0;
int foot_num=0;
int chicken = 0;
int rabbit = 0;
bool result = true;
cout<<"***** 鸡兔同笼问题 *****"<<endl;
cout<<" 请输入鸡兔的头总数:";
cin>>head_num;
cout<<" 请输入鸡兔的脚总数:";
cin>>foot_num;
result = handle_chicken_rabbit_num(&chicken,&rabbit,head_num,foot_num);
cout<<endl;
cout<<"计算结果:" <<endl;
cout<<"鸡兔头总数:"<<head_num<<",鸡兔脚总数:"<<foot_num<<endl;
if ( true == result )
{
cout<<"鸡有 "<<chicken<<" 只,兔有 "<<rabbit<<" 只"<<endl;
}
else
{
cout<<"题目错误,无法得到正确结果!!!"<<endl;
}
return 0;
}
欢迎大家留言提出算法改进意见
Juyin@2018/4/24