C语言问题,谁来帮忙看看代码

Description

“百钱买百鸡”是我国著名的古代数学问题,中国古代数学家张丘建在他的《算经》中提出了这样一个问题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
你的任务是求解下面这个问题。问题是这样描述的:a文钱可买一只公鸡,b文钱可买一只母鸡,c文钱可买d只小鸡。用m文钱买n只鸡,那么有公鸡x只、母鸡y只、小鸡z只。求解出符合题意的x,y,z。

Input

输入为一张表。第一行是一个固定不变的表头,格式见sample。后面有多行,每行为一组测试数据。每组测试数据由6个整数组成,分别为“a,b,c/d,m,n”。满足0<a,b,c,d<=50,50<=m,n<=108+1,并且母鸡和小鸡的单价不会相同。

Output

每组测试数据的运行结果输出为一张表,表头固定为“COCKS,HENS,CHICKS”。每组测试数据的一个可行解数出为一行,为三个整数:“x,y,z”。多组解按照公鸡数从少到多的顺序输出。若测试数据无解则输出“Cannot
buy!”。两组测试数据之间用一个空行分隔开。

Sample Input

COCK,HEN,CHICK,MONEY,CHICKS
3,2,1/3,100,100
5,3,1/3,100,100
8,5,1/7,100,100
8,5,1/7,300,300

Sample Output

COCKS,HENS,CHICKS
0,40,60
5,32,63
10,24,66
15,16,69
20,8,72
25,0,75

COCKS,HENS,CHICKS
0,25,75
4,18,78
8,11,81
12,4,84

Cannot buy!

COCKS,HENS,CHICKS
8,40,252

HINT

本题重点在于了解多重循环的运行效率问题,减少一层循环可以降低很大规模的运算量。通过在循环体内加计数器可以统计出循环的运行次数,当测试数据变大时,运行次数的增长会非常可观,这就是超时的原因了。

Append Code

上面是题目,这是代码:

#include <stdio.h>
int main()
{
int a,b,c,d,m,n,j,x,y,z,i=0;
scanf("COCK,HEN,CHICK,MONEY,CHICKS");
while(scanf("%d,%d,%d/%d,%d,%d",&a,&b,&c,&d,&m,&n)!= EOF)
{
j=0;
for(x=0; x<=m/a; x++)
{
z = (m-a*x-n*b+x*b)*d / (c - b*d);
y = n-x-z;
if((x*a*d + y*b*d + z*c == m*d)&&(y>=0&&z>=0))
{
if(j==0)
puts ("COCKS,HENS,CHICKS");
printf("%d,%d,%d\n",x,y,z);
j++;
}
}
if(j==0)
{
printf("Cannot buy!\n");
printf("\n");
}
else
printf("\n");
}
return 0;
}

请问代码里面的if(j==0)是判断什么的啊?看不懂,求详细解释一下!

#include <stdio.h>
int main()
{
    int a,b,c,d,m,n,j,x,y,z,i=0;
    scanf("COCK,HEN,CHICK,MONEY,CHICKS");
    while(scanf("%d,%d,%d/%d,%d,%d",&a,&b,&c,&d,&m,&n)!= EOF)
    {
        //初始化计数值j为0
        j=0;
        //假设从0只公鸡开始循环计算,累计循环直到可买最多公鸡数目m/a
        for(x=0; x<=m/a; x++)
        {
            //计算得出小鸡数量z
            z = (m-a*x-n*b+x*b)*d / (c - b*d);
            //计算得出母鸡数量y
            y = n-x-z;
            //当满足ax+by+(c/d)z=m且z和y都大于等于0这3个条件说明是可输出结果
            if((x*a*d + y*b*d + z*c == m*d)&&(y>=0&&z>=0))
            {
                //判断输出计数值j是否为0,是则说明要输出表头
                if(j==0)
                    puts ("COCKS,HENS,CHICKS");
                //输出第j次结果
                printf("%d,%d,%d\n",x,y,z);
                //计数值j自增
                j++;
            }
        }
        //当循环完x到m/a,且j仍旧为0,则说明没有结果可以输出,即Cannot buy
        if(j==0)
        {
            printf("Cannot buy!\n");
            printf("\n");
        }
        else
        printf("\n");
    }
    return 0;
}

追问

多谢!懂了!

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答