本帖最后由 CrLf 于 2012-4-3 21:30 编辑
该函数在区分大小月时采用了独创的算法,所以比较简洁
就题解题就改成这样:- @echo off
- set /a y=2012,m=4,d=3
- set /a var=d-726467+30*m+m/9*-~m/2+!(m/9)*m/2+!!(m/3)*(!(y%%4)-!(y%%100)+!(y%%400)-2)+y*365+~-y/4-~-y/100+~-y/400-396,var%%=5
- if %var% leq 3 (echo 打鱼) else echo 晒网
- pause
复制代码 其中用了大量的 ~-N,其实它与 N-1 等效(同理,-~N 与 N+1 等效),但由于 ~ 与 -(负号) 的优先级高于乘除运算,故 ~-N 可节省一对括号
当然还可以再简洁点,不过估计更没人看得懂了...- @echo off
- set /a y=2012,m=4,d=3
- set /a "1/((d-726467-396+30*m+m/9*-~m/2+!(m/9)*m/2+!!(m/3)*(!(y%%4)-!(y%%100)+!(y%%400)-2)+y*365+~-y/4-~-y/100+~-y/400)%%5/4)" 2>nul&&echo echo 晒网||echo 打鱼
- pause
复制代码 回复 9# HAT
算法简单解释:
set /a var=d-726863+30*m+m/9*-~m/2+!(m/9)*m/2+!!(m/3)*(!(y%%4)-!(y%%100)+!(y%%400)-2)+y*365+~-y/4-~-y/100+~-y/400,var%%=5- d-726467
- rem 用日减去 1970-01-01~1990-01-01 之间的天数
- 30*m+m/9*-~m/2+!(m/9)*m/2
- rem 先将月份统一乘 30 天,若m大于9,则将日期减去月份加1的一半,否则减去月份的一半
- !!(m/3)*(!(y%%4)-!(y%%100)+!(y%%400)-2)
- rem 当月份大于2的时候,天数减2,还要判断年份是否为闰年,如果是则加1
- y*365+~-y/4-~-y/100+~-y/400-396
- rem 先将年份统一乘365天,再减去闰年的数量
- -396
- rem 消除年月均从0开始计算产生的多余天数
- var%%=5
- rem 将所得的日期偏移量求余
复制代码
|