@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
В соответствии с Wikipedia год является високосным, если он делится на 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))"
дает полный результат.
Как человек решит это? – jeb
зависит от того, что он хочет ввести. например, если он вводит 2016, то это високосный год. –
Ага, может быть, есть правило о високосных годах? Или это случайный? Знаете ли вы, что 2028 год будет високосным годом? – jeb