鸡兔同笼问题

问题:已知鸡、兔的头和脚总数,求分别有多少只鸡和兔?

对于该问题我们可以采用穷举法来计算。

分析:

一只鸡有一个头、两只脚

一只兔子有一个头、四只脚

设鸡有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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值