SZU第14周MOOC编程练习【id:457】【25分】D. 任意鸡任意钱问题

题目描述

编写程序输入要买的鸡的总数以及钱数,输出能够买的公鸡、母鸡以及小鸡的个数(用函数求解并输出结果,要求在主函数调用该函数实现求解,假设公鸡5元一只、母鸡3元一只、小鸡1元可买3只)

设公鸡、母鸡、小鸡个数是x\y\z,即满足5x+3y+z/3=A,x+y+z=B,其中A和B是钱总数和鸡总数

A和B是已知条件,x\y\z是非负整数,求x\y\z

输入

测试数据的组数 t

第一组 鸡数 钱数

第二组 鸡数 钱数

.......

输出

第一组解个数

第一组第一个解公鸡数 母鸡数 小鸡数

第一组第二个解公鸡数 母鸡数 小鸡数

.........

第二组解个数

第二组第一个解公鸡数 母鸡数 小鸡数

第二组第二个解公鸡数 母鸡数 小鸡数

.........

IO模式

本题IO模式为标准输入/输出(Standard IO),你需要从标准输入流中读入数据,并将答案输出至标准输出流中。

代码如下:

#include <stdio.h>
int a[100000][3];
void find(int c, int m) {
    int count = 0;
    for (int x=1;x<=m/5;x++) //特意从1开始遍历的,因为要得到指定输出
        for (int y=0;y<=m/3; y++){
            int z=c-x-y; 
            if (z>=0 && (5*x+3*y+z/3.0)==m &&z%3==0) {
                a[count][0]=x;
                a[count][1]=y;
                a[count][2]=z;
                count++;
            }
        }
        
    printf("%d\n",count);
    for(int i=0;i<count;i++)
    {
    	printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
	}
    
    
}


int main() {
    int t, tc, tm;
    scanf("%d",&t);
    while(t--)
    {
		scanf("%d%d",&tc,&tm);
        find(tc, tm);
	}
    return 0;
}

开头定义了一个数组int a[100000][3];用来储存每一组的解,在后面解释具体用途

然后解读主函数:

tc为总鸡数,tm为总钱数(是total money的意思,懒得打全称所以首字母缩写,没有在骂人(编辑文稿的时候才看出来有歧义……)

每组在输入鸡的数量和钱的数量之后就进入find函数找解,这里我在函数里输出所以不用返回值,如果你想在主函数里输出就要定义有返回值的函数

int main() {
    int t, tc, tm;
    scanf("%d",&t);
    while(t--)
    {
		scanf("%d%d",&tc,&tm);
        find(tc, tm);
	}
    return 0;
}

再来看看find函数:c和m为局部变量,对应主函数里的总鸡数和总钱数

count为解的个数,x为公鸡只数,y为母鸡数量,z为小鸡数量,因为输出的时候是先输出解的个数,再输出具体的解,所以每组解都需要储存(除非之后再解一遍,不过没有必要

用x+y+z=c解小鸡数量,所以判断条件里要加上z为3的倍数(一元钱三只小鸡)

void find(int c, int m) {
    int count = 0;
    for (int x=1;x<=m/5;x++) 
        for (int y=0;y<=m/3; y++){
            int z=c-x-y; 
            if (z>=0 && (5*x+3*y+z/3.0)==m &&z%3==0) {
                a[count][0]=x;//公鸡数量
                a[count][1]=y;//母鸡数量
                a[count][2]=z;//小鸡数量
                count++;
            }
        }
        
    printf("%d\n",count);
    for(int i=0;i<count;i++)
    {
    	printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
	}
    
    
}

另外可能有人会好奇为什么x从1开始数,这里也解释一下

这个题公鸡数量x必须>=1才能得出正确的输出结果,但是题里没有要求,出于过剩的好奇心,我去查了一下百钱百鸡问题的原文:(摘自百度百科)

百鸡百钱是我国古代数学家张丘建在《算经》一书中提出的数学问题:“鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?”

并没有给出这样的限制条件,而且百度百科里给出的答案之一就是母鸡25只,公鸡0只,小鸡75只,如图:

就当是这个题的特殊之处吧,大家在完成oj的时候还是要注意一下的,如果平时写的话就不要写x>=1了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值