题目描述
编写程序输入要买的鸡的总数以及钱数,输出能够买的公鸡、母鸡以及小鸡的个数(用函数求解并输出结果,要求在主函数调用该函数实现求解,假设公鸡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了
239

被折叠的 条评论
为什么被折叠?



