一个极其脑残的C语言算法疑问

来源:百度知道 编辑:UC知道 时间:2024/06/04 15:20:45
要求:判定2000-2500年中的每一年是否闰年,将结果输出。
附加闰年的条件:1)能被4整除,但不能被100整除的年份都是闰年。2)能被100整除,又能被400整除的年份都是闰年。
书上的算法是:设y为被检测的年份
S1:2000=>y
S2:若y不能被4整除,则输出y是“不是闰年”。然后转到S6。
S3:若y能被4整除但不能被100整除,则输出y“是闰年”。然后转到S6。
S4:若y能被100整除,又能被400整除,则输出y“是闰年”。然后转到S6。
S5:输出y“不是闰年”。
S6:y+1=>y
S7:当y≤2500是,转到S2继续执行;否则停止。

我的问题是:1)闰年的条件2:能被400整除就肯定能被100整除啊,为什么要专门强调100?有什么作用吗?
2)在这个算法中,每一步都分离出一些范围,逐步缩小范围,直到执行S5时,只能是非闰年。请问这个范围是怎么样根据条件分离出来的?
3)还有其他的分离方法吗?
4)可不可以直接写成这样:
S1:2000=>y
S2:如果y能被4整除但不能被100整除,则输出y“是闰年”。
S3:如果y能被100整除又能被400整除,则输出y“是闰年”。
S4:输出y“不是闰年”。
S5:y+1=>y
S6:当y≤2500是,转到S2继续执行;否则停止。
这是谭浩强老先生书上的例子啊!在下菜鸟,感激不尽!

这是判断闰年的两个条件,互不干涉,任意条件满足即可

比如2004年,能被4整除,但不能被100整除,就是闰年
比如2000年,能被400整除,就是闰年

两个条件是"或"的关系

可以按如下方法判断
int y;
for(y=2000;y<=2500;y++)
if (y%4==0 && y%100!=0 || y%400==0){
printf("%d是闰年\n",y);
}else{
printf("%d不是闰年\n",y);
}

for(n=2000;n<2006;n++)
if((n%4==0&&n%100!=0)||n%400) printf("%d\t",n);

S3和S4的算法只是一个局部的if else,所以不用管它,
你后来提到的那个S3可不用判断100,因为能被400一定可以被100整除。