鸡兔同笼问题解析
问题描述
已知鸡和兔的总数量为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(4n−m) ,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
好的算法可以节约大量的时间,一些好的算法都是以数学为基础的,还望大家学好数学。