# Issue

*This Content is from Stack Overflow. Question asked by Vitor Niskier *

```
leap_year = int(input('Year: '))
initial_year = leap_year
while True:
leap_year += 1
if leap_year % 4 == 0 and (leap_year % 100 == 0 and leap_year % 400) == 0:
print(f'The next leap year after {initial_year} is {leap_year}')
break
```

Can someone explain to me how this: if leap_year % 4 == 0 and (leap_year % 100 == 0 and leap_year % 400) == 0:

is different from this: if leap_year % 4 == 0 and leap_year % 100 == 0 and leap_year % 400 == 0:

# Solution

It’s confusing how there’s an `== 0`

at the end, which is functionally the same as putting `not`

before that part. It’s also confusing how `leap_year % 400`

isn’t directly compared against anything, unlike the other modulo operations.*

It’d be clearer to rewrite it:

```
leap_year % 4 == 0 and not (leap_year % 100 == 0 and leap_year % 400 != 0)
```

If we apply De Morgan’s law, it might be even clearer:

```
leap_year % 4 == 0 and (leap_year % 100 != 0 or leap_year % 400 == 0)
```

Lastly, you could remove the parentheses at this point, but it’s better for readability to keep them.

Now it should be obvious how it differs from the other condition you mentioned.

* *What actually happens there is that the and evaluates leap_year % 100 == 0 and if it’s falsy, it yields the result, i.e. False; if it’s truthy, it yields the result of leap_year % 400, i.e. an int in range(0, 400, 100). That gets compared against the == 0 at the end, and for False it works because False == 0.*

This Question was asked in StackOverflow by Vitor Niskier and Answered by wjandrea It is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.