0

让我们有一个名为 isLeapYear 的函数,它的参数是一年。如果年份是闰年,它必须返回真,否则返回假。

正如维基百科所述,条件是:

如果年份不能被 4 整除,则为平年,否则,如果年份不能被 100 整除,则闰年,否则,如果年份可被 400 整除,则闰年,否则为闰年。

我们能否用两个条件而不是三个条件来定义它是否是闰年?

4

2 回答 2

3

是的,如果您将以下情况视为“两个条件”:

如果一年不能被 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)
}
于 2014-04-20T23:45:25.177 回答
2

不,有三个条件而不是两个。

于 2014-04-20T23:45:14.323 回答