首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

鸡兔同笼,该怎么处理

2013-04-05 
鸡兔同笼鸡兔同笼时间限制:3000 ms|内存限制:65535 KB难度:1描述已知鸡和兔的总数量为n,总腿数为m。输入n和

鸡兔同笼
鸡兔同笼
时间限制:3000 ms  |  内存限制:65535 KB
难度:1
描述
已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡和兔的数目,如果无解,则输出“No answer”(不要引号)。
输入
第一行输入一个数据a,代表接下来共有几组数据,在接下来的(a<10)
a行里,每行都有一个n和m.(0<m,n<100)
输出
输出鸡兔的个数,或者No answer
样例输入
2
14 32
10 16
样例输出
12 2
No answer

#include<stdio.h>
int main()
{
int chicken,n;
scanf("%d",&n);
while(n--)
{int sum,sumfoot;
scanf("%d %d",&sum,&sumfoot);
int m=1;
for(int chicken=1;chicken<=sum;chicken++)
{
if(chicken*2+(sum-chicken)*4==sumfoot)
{
printf("%d %d\n",chicken,sum-chicken);
m=0;
}

}
if(m==1)
{
printf("No answer\n");
}
}
return 0;
}

南阳理工ACM 为什么我的不给通过 难道不符合题吗
[解决办法]
void fun(int n ,int m)
{
    if (n <=0 
[解决办法]
 m <= 0 
[解决办法]
 n > m 
[解决办法]
 m%2 != 0)
    {
        printf("输入不合法\n");
        return ;
    }
    int nCount = 0;
    for (int i = 0; i!= n;++i)
    {
        if (i*2 + (n-i)*4 == m)
        {
            printf("鸡:%d 兔:%d\n" ,i ,n - i) ;
            nCount++;
        }
    }
    if (nCount == 0)
    {
        printf("No answer\n" );
    }
}


int main()
{
    int n ,m;
    printf("请输入个数和总腿数:");
    scanf("%d%d" ,&n ,&m);
    fun(n,m);
    return 0;

}

[解决办法]
http://t.qq.com/p/t/184688001601786

二元一次方程都弱爆了。鸡兔同笼新算法:已知共有鸡和兔15只,共有40只脚,问鸡和兔各有几只。算法:假设鸡和兔训练有素,吹一声哨,它们抬起一只脚,(40-15=25) 。再吹一声哨,它们又抬起一只脚,(25-15=10) ,这时鸡都一屁股坐地上了,兔子还两只脚立着。所以,兔子有10/2=5只,鸡有15-5=10只
[解决办法]
顶LS,应该用解方程的方式来求解而不是暴力遍历求解,那样很容易超过时间限制。

[解决办法]

/**
 * @file    legs.c
 * @brief   鸡兔同笼
 */

#include <stdio.h>

/** 
 * @brief 二元一次方程求解
 *
 * 二元一次方程:
 * ax + by + c = 0
 * dx + ey + f = 0


 * 解为:
 * x = (bf - ec)/(ea - bd)
 * y = (af - dc)/(db - ae)
 * 
 * @param x 未知数x
 * @param y 未知数y
 * @param a 方程一系数
 * @param b 方程一系数
 * @param c 方程一系数
 * @param d 方程二系数
 * @param e 方程二系数
 * @param f 方程二系数
 * 
 * @retval  0-成功
 * @retval -1-失败
 */
int calc(int *x, int *y, int a, int b, int c, int d, int e, int f)
{
    if (e * a - b * d != 0 && d * b - a * e != 0) {
        *x = (b * f - e * c) / (e * a - b * d);
        *y = (a * f - d * c) / (d * b - a * e);
        return 0;
    } else {
        return -1;
    }
}


/** 
 * @brief 鸡兔同笼求解
 * 
 * 利用二元一次方程
 * x + y = n
 * 4x + 2y = m
 * 
 * @param x 兔子
 * @param y 鸡
 * @param m 腿数
 * @param n 只数
 * 
 * @return 
 */
int legs(int *x, int *y, int m, int n)
{
    int a, b, c, d, e, f;

    a = 1, b = 1, c = -n;
    d = 4, e = 2, f = -m;

    if (calc(x, y, a, b, c, d, e, f) == 0) {
        /* 保证只数为非负整数 */
        if (*x + *y == n && *x * 4 + *y * 2 == m
                && *x >= 0 && *y >= 0) {
            return 0;
        } else {
            return -1;
        }
    } else {
        return -1;
    }
}

int main(int argc, char *argv[])
{
    int x, y;
    int m, n;
    int i, c;

    scanf("%d", &c);
    for (i = 0; i < c; ++i) {
        scanf("%d %d", &n, &m);
        if (legs(&x, &y, m, n) == 0)
            printf("%d %d\n", y, x);


        else
            printf("No answer\n");
    }

    return 0;
}


[解决办法]
复习一下小学的二元一次方程组

ax + by + c = 0
dx + ey + f = 0
=>
dax + dby + dc = 0
adx + aey + af = 0
=>
(db - ae)y = af - dc
=>
y = (af - dc)/(db - ae)

[解决办法]
果然是循环惯了,舍简求繁了。
n 个数;
m 腿数;
有解条件:
1.m必须是偶数
k = m-2*n;
2.k>=0
3 k%2 != 1;
兔数 = k/2;
鸡数 = n-k/2;

热点排行