鸡兔同笼问题的解析

鸡兔同笼问题解析

问题描述

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

样例输入:
14 32
样例输出
12 2

样例输入:
10 16
样例输出
No answer

问题分析

此问题可以直接通过一元二次方程进行解析,也可以用C语言的穷举法进行解答,下面从两个方面进行分析

一元二次方程
设鸡有a只,兔子有b只,则a+b=n,2a+4b=m,联立解得a= ( 4 n − m ) 2 \frac{(4n-m)}{2} 2(4nm) ,b = n - a。在什么情况下此解“不算数”呢,首先,a和b都是正整数。(算法一)

穷举算法就是通过内外循环来进行暴力破解。(算法二)

C语言描述

算法一

#include<stdio.h>
int main()
{
	int a,b,n,m;
    scanf("%d%d",&n,&m);
    a = (4*n-m)/2;
    b = n -a;
    if(m % 2 == 1 || a < 0 || b < 0)
    {
    	printf("No answer\n");
	}else{
		printf("%d %d",a,b);
	}
	return 0;
}

算法二

#include<stdio.h>//第一种暴力破解
int main()
{
	int a,b,n,m;
    scanf("%d%d",&n,&m);
   	for(int a = 0 ; a < n ; a++)
   	{
   		for(int b =0 ; b < n ;b++)
   		{
   			if((2*a) + (4*b) == m)
   			{
   				printf("%d%d",a,b);
   				return 0;
			}
		}
	}
	printf("No answer\n");
	return 0;
}
#include<stdio.h>//第二种暴力破解
int main()
{
	int a,b,n,m;
    scanf("%d%d",&n,&m);
   	for(int a = 0 ; a < n ; a++)
   	{
   		for(int b =0 ; b < n - a ;b++)
   		{
   			if((2*a) + (4*b) == m)
   			{
   				printf("%d%d",a,b);
   				return 0;
			}
		}
	}
	printf("No answer\n");
	return 0;
}

总结

相比较上面的三种算法

  • 第一种算法(通过一元二次方程组解答)效率和代码量都比较小,是三种算法中最好的算法,时间复杂度为O(1)
  • 第二个算法的第一种写法是完全通过穷举算法来进行,这样的时间复杂度是最大的,为:O(n2)
  • 第二个算法的第二种写法,虽然缩减了数据的运算量,但还是运算量比较大,时间复杂度为: n 2 2 \frac {n^2}{2} 2n2

好的算法可以节约大量的时间,一些好的算法都是以数学为基础的,还望大家学好数学。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值