该程序为闰年提供了错误的输出负载变量的值是错误的我认为 Ex.1900,1700

问题描述

*程序为不是闰年的世纪年提供错误输出 Ex.1900,1700。程序为闰年提供错误输出负载变量的值是错误的,我认为 Ex.1900,1700。 *

#include <iostream>

using namespace std;

int main()
{
    int year;
    bool t1=true;
    cout<<t1;
    bool t2=false;
    cin>>year;
    if(year%4==0)
    {
       int value=year%100?year%400?t1:t2:t1;
       cout<<value;
       if(value==t1)
       {
           cout<<"leap year";
       }
       else
       {
           cout<<"not a leap year";
       }
    }
    else
    {
        cout<<"not a leap year";
    }
}

解决方法

year%100 可被 100 整除(余数为零)时,

year 变为假;当 year 不能被 100 整除(余数不为零)时,

year%400 变为真。

> 当 year 可被 400 整除(余数为零)时,

year 变为假;当 year%100 不能被 400 整除(余数不为零)时,

year%400 变为真。

>

因此,当int value=year%100?year%400?t1:t2:t1; 为假而bool value=year%100?t1:year%400?t2:t1; 为真时,您必须判断该数字不是闰年,否则判断为不是闰年。

总之,行

int

应该

bool

另外我认为在这里使用 PageView 来分配 NotificationListener<OverscrollIndicatorNotification> 变量是不合理的。

,

除了 MikeCAT 的答案中的修复之外,您还可以将代码显着简化为几行:

#include <iostream>

int main()
{
    int year;
    std::cin>>year;
    bool leap = (year % 4 == 0) && ( (year % 100 != 0) || (year % 400 == 0) );
    if(leap)
    {
        std::cout<<"leap year";
    }
    else
    {
        std::cout<<"not a leap year";
    }
}

您可以使用 0 等价于 false 以使其更短,但我认为第一个版本更具可读性:

    bool leap = !(year % 4) && ( (year % 100) || !(year%400) );
,

一旦编译器正确实现了 C++20(尚未发布),您就不必重新发明轮子,可以使用 std::chrono::year::is_leap

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;

    year y = 1900y;
    std::cout << "year: " << static_cast<int>(y)
              << " is " << (y.is_leap()?"":"not ") << "a leap year\n";
}

godbolt