for的条件判断问题

3.中国古代数学家张丘建提出的“百鸡问题”:
一只大公鸡值五个钱,一只母鸡值三个钱,三个小鸡值一个钱。现在有100个钱,要买100只鸡,是否可以?若可以,给出一个解,要求三种鸡都有。请写出求解该问题的程序。
思路:
公鸡x只,母鸡y只,小鸡z只
条件5x+3y+1/3z<=100,x+y+z=100
可能的情况
x=1的时候,
z=96,y=3,
z=93, y=6
从z=96开始循环下去;
x=2的时候,
z=96,y=2,
z=93, y=5
从z=96开始循环下去;

1、当我x算一层的时候,y没有在for里面初始化,也可以执行,为什么呢?
#include
int main()
{
int x,y,z;
for( x=1,z=96; 5x+3y+z/3<=100 && z>=3;z=z-3)
{ y=100-x-z;
printf("%d,%d,%d\n",x,y,z); }

}

2、当我x算多层的时候,y也是没有在for里面初始化,但就不进入循环了,为什么呢?
#include
int main()
{
int x,y,z;
for( x=1; 5x+3y+z/3<=100 && x<=98;x++) \这里为什么直接就不进入循环了
{for( z=96; 5*x+3*y+z/3<=100 && z>=3;z=z-3)
{ y=100-x-z;
printf("%d,%d,%d\n",x,y,z); }}
}

3、当我x算多层的时候,我对2进行了修改,在for里面做好初始化,就可以了
#include
int main()
{
int x,y,z;
for( x=1; x<=98;x++) \这里做正确
{
for( z=96,y=100-x-z; 5*x+3*y+z/3<=100 && z>=3&&y>0;z=z-3)
{ printf("%d,%d,%d\n",x,y,z); }
}

}

y没初始化也可以执行的原因是:在有的编译器中,未初始化的变量有几种处理方式,一种是默认初始化为0,一种是随机值,随机值的时候往往是一个大负数或者大正数,所以,在y不初始化的时候,在部分编译器中是可以执行的,如果是第二种处理方式,程序能不能执行完全靠运气。因此,在高版本的编译器中,会有严格的检查,未初始化的变量一般会有警告或报错。

y=100-x-z; 这里对y赋值了,就不需要初始化了
不初始化的影响主要用在注入 y+=10这种,因为y没有初始化,所以y+10的结果也是未确定的
===========
for( x=1; 5 * x+3 * y+z/3<=100 && x<=98;x++)
这里你的循环结束条件用到了y,但y并没有初始化,所以y可能是任意值,导致 5 * x+3 * y+z/3<=100 条件没有满足,所以循环是无法执行的。
===========
for( x=1; x<=98;x++) \这里做正确 -- 这里只用了x,而x=1对x进行了初始化,所以OK
{
for( z=96,y=100-x-z; 5*x+3*y+z/3<=100 && z>=3&&y>0;z=z-3) 这里for第一项中 z=96,y=100-x-z,对z和y进行了初始化,所以后面的循环条件判断就OK了

#include <stdio.h>

void main(){
	
	/*
		100元买100只鸡
		1.公鸡5元一只,母鸡1元一只,小鸡3只一元
	*/
	int i,j,k;
	int cnt=0;
	for(i=1;i<100;i++){ //i代表公鸡的数量 
		for(j=1;j<100;j++){ //j代表母鸡的数量 
			for(k=1;k<100;k++){ //k代表小鸡的数量 
				if(i+j+k==100 && i*5+j*1+ k/3== 100 && k%3==0){
					printf("公鸡%d只,母鸡%d只,小鸡%d只。\n",i,j,k);
					cnt++;
				}
			}
		}
	}
	printf("共%d种购买方式\n",cnt);
	
	
	
	
} 

 

1.你的y值应该初始化的,没有初始化也能运行只是运气好,如果y的初始值是个大于33的正数,你的1肯定也不执行了
2.你的双重循环都依赖y,而内层的z循环结束后是个非常小的数,y=100-1=99,3x99>100,外层当然执行不下去了
3.修改后你的y只计算一次,而不是在z循环时每次都跟着z变化,当然就没问题了

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632