@echo off
setlocal
set /P "year=Enter year: "
set /A "leap=!(year%%4) + (!!(year%%100)-!!(year%%400))"
if %leap% equ 1 echo Is leap year
Согласно Википедии, год считается високосным, если он делится на 4, за исключением случаев, когда он также делится на 100. , и в этом случае он является скачкообразным только в том случае, если он также делится на 400 («делимый» означает, что остаток от деления на данное число равен нулю). Таким образом, 2000 и 2400 годы являются високосными, потому что их остатки при делении на 400 равны нулю, а 2100, 2200 и 2300 — нет: это особые случаи, потому что их остатки при делении на 100 равны нулю.
В команде set /A
логический оператор НЕ !
дает 1, если его операнд равен нулю, и возвращает 0 в любом другом случае, поэтому set /A "leap=!(year%%4)"
дает 1, если год делится на 4, и ноль в любом другом случае; это дает первую часть результата.
После этого нам нужно вычесть из этого значения 1 в 2100, 2200 и 2300 годах, но ничего не вычесть в 2000 и 2400 годах; то есть:
year year%%100 a=!!(year%%100) year%%400 b=!!(year%%400) a-b
2000 0 0 0 0 0
2100 0 0 100 1 -1
2200 0 0 200 1 -1
2300 0 0 300 1 -1
2400 0 0 0 0 0
Если год не делится на 100, то оба значения a
и b
равны 1, поэтому a-b
равно нулю, а результат определяется только первоначальным остатком на 4.
Таким образом, формула set /A "leap=!(year%%4) + (!!(year%%100)-!!(year%%400))"
дает полный результат.
person
Aacini
schedule
02.02.2016