鸡兔同笼问题的解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15237565/article/details/79619972

title: 2鸡兔同笼
tags:C语言,数据结构与算法

grammar_cjkRuby: true

鸡兔同笼问题解析

问题描述

已知鸡和兔的总数量为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 ,b = n - a。在什么情况下此解“不算数”呢,首先,a和b都是正整数。(算法一)

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

C语言描述

算法一

#include<stdio.h>
int main()
{
    int a,b,n,m;
    scanf("%d%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%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%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

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

猜你喜欢

转载自blog.csdn.net/qq_15237565/article/details/79619972