让我们有一个名为 isLeapYear 的函数,它的参数是一年。如果年份是闰年,它必须返回真,否则返回假。
正如维基百科所述,条件是:
如果年份不能被 4 整除,则为平年,否则,如果年份不能被 100 整除,则闰年,否则,如果年份可被 400 整除,则闰年,否则为闰年。
我们能否用两个条件而不是三个条件来定义它是否是闰年?
让我们有一个名为 isLeapYear 的函数,它的参数是一年。如果年份是闰年,它必须返回真,否则返回假。
正如维基百科所述,条件是:
如果年份不能被 4 整除,则为平年,否则,如果年份不能被 100 整除,则闰年,否则,如果年份可被 400 整除,则闰年,否则为闰年。
我们能否用两个条件而不是三个条件来定义它是否是闰年?
是的,如果您将以下情况视为“两个条件”:
如果一年不能被 4 整除,或者能被 100 整除但不能被 400 整除,那么它就是普通年。
否则就是闰年。
用 C 实现,例如:
int IsCommon(int year)
{
if (year%4 != 0 || (year%100 == 0 && year%400 != 0))
return 1;
else
return 0;
}
但是请注意,就运行时性能而言,将 Wikipedia 的定义从“三个条件”“浓缩”为“两个条件”并没有太大的收获。逻辑运算符 (||
和&&
) 产生与条件语句相同的分支,例如if/else if
...
这是一个替代解决方案,它依赖于switch/case
编译语句的方式,并且只执行单个分支操作。请注意,这是一个编程解决方案,而不是算法解决方案。它至少适用于 C、C++ 和 Java(不包括次要语义),但在其他语言中可能也有类似的变体(例如,Python 中的字典):
int IsCommon(int year)
{
switch (year%400)
{
case 0:
case 4:
case ...
case 96:
case 104:
case ...
case 196:
case 204:
case ...
case 296:
case 304:
case ...
case 396:
return 0;
}
return 1;
}
如果我没记错的话,那么switch/case
当所有案例都以递增和连续的顺序列出时,以最有效的方式编译语句,从 0 开始。因此您可以进一步扩展此代码,如下例所示:
int IsCommon(int year)
{
switch (year%400)
{
case 0: return 0;
case 1: return 1;
case 2: return 1;
case 3: return 1;
case 4: return 0;
case 5: return 1;
case 6: return 1;
case 7: return 1;
case ...
case 96: return 0;
case 97: return 1;
case 98: return 1;
case 99: return 1;
case 100: return 1;
case 101: return 1;
case 102: return 1;
case 103: return 1;
case 104: return 0;
case 105: return 1;
case 106: return 1;
case 107: return 1;
case ...
case 196: return 0;
case 197: return 1;
case 198: return 1;
case 199: return 1;
case 200: return 1;
case 201: return 1;
case 202: return 1;
case 203: return 1;
case 204: return 0;
case 205: return 1;
case 206: return 1;
case 207: return 1;
case ...
case 296: return 0;
case 297: return 1;
case 298: return 1;
case 299: return 1;
case 300: return 1;
case 301: return 1;
case 302: return 1;
case 303: return 1;
case 304: return 0;
case 305: return 1;
case 306: return 1;
case 307: return 1;
case ...
case 396: return 0;
case 397: return 1;
case 398: return 1;
case 399: return 1;
}
return -1; // Just in order to prevent a compilation error (i.e., dummy)
}
不,有三个条件而不是两个。