| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- from decimal import ROUND_FLOOR, Decimal
- def quot2(dividend: Decimal, divisor: Decimal) -> Decimal:
- return (dividend / divisor).to_integral_value(rounding=ROUND_FLOOR)
- def mod2(dividend: Decimal, divisor: Decimal) -> Decimal:
- return dividend - quot2(dividend, divisor) * divisor
- def quot3(value: Decimal, low: Decimal, high: Decimal) -> Decimal:
- dividend = value - low
- divisor = high - low
- return (dividend / divisor).to_integral_value(rounding=ROUND_FLOOR)
- def mod3(value: Decimal, low: Decimal, high: Decimal) -> Decimal:
- dividend = value - low
- divisor = high - low
- return mod2(dividend, divisor) + low
- def max_day_in_month(year: Decimal, month: Decimal) -> Decimal:
- norm_month = int(mod3(month, Decimal(1), Decimal(13)))
- norm_year = year + quot3(month, Decimal(1), Decimal(13))
- if norm_month in (1, 3, 5, 7, 8, 10, 12):
- return Decimal(31)
- if norm_month in (4, 6, 9, 11):
- return Decimal(30)
- is_leap_year = (
- mod2(norm_year, Decimal(400)) == 0
- or mod2(norm_year, Decimal(100)) != 0
- and mod2(norm_year, Decimal(4)) == 0
- )
- if norm_month == 2 and is_leap_year:
- return Decimal(29)
- return Decimal(28)
|