zoukankan      html  css  js  c++  java
  • 示例:日期运算

    (defconstant month
                        #(0 31 59 90 120 151 181 212 243 273 304 334 365))

    (defconstant yzero 2000)

    (defun leap? (y)
        (and (zerop (mod y 4))
            (or (zerop (mod y 400))
                (not (zerop (mod y 100))))))

    (defun date->num (d m y)
           (+ (- d 1) (month-num m y) (year-num y)))

    (defun month-num (m y)
           (+ (svref month (- m 1))
              (if (and (> m 2) (leap? y)) 1 0)))

    (defun year-num (y)
           (let ((d 0))
             (if (>= y yzero)
             (dotimes (i (- y yzero) d)
               (incf d (year-days (+ yzero i))))
             (dotimes (i (- yzero y) (- d))
               (incf d (year-days (+ y i)))))))

    (defun year-days (y)
        (if (leap? y) 366 365))

    (defun num->date (n)
           (multiple-value-bind (y left) (num-year n)
             (multiple-value-bind (m d) (num-month left y)
               (values d m y))))

    (defun num-year (n)
           (if (< n 0)
               (do* ((y (- yzero 1) (- y 1))
                 (d (- (year-days y)) (- d (year-days y))))
                ((<= d n) (values y (- n d))))
               (do* ((y yzero (+ y 1))
                 (prev 0 d)
                 (d (year-days y) (+ d (year-days y))))
                ((> d n) (values y (- n prev))))))

    (defun num-month (n y)
           (if (leap? y)
               (cond ((= n 59) (values 2 29))
                 ((> n 59) (nmon (- n 1)))
                 (t (nmon n)))
               (nmon n)))

    (defun nmon (n)
           (let ((m (position n month :test #' <)))
             (values m (+ 1 (- n (svref month (- m 1)))))))

    (defun date+ (d m y n)
           (num->date (+ (date->num d m y) n)))

  • 相关阅读:
    PAT 乙级真题 1013.组个最小数
    PAT 乙级真题 1012.D进制的A+B
    PAT 乙级真题 1011.个位数统计
    PAT 乙级真题 1010.月饼
    PAT 乙级真题 1009.1019.数字黑洞
    PAT 乙级真题 1008.锤子剪刀布
    PAT 乙级真题 1007.A除以B
    PAT 乙级真题 1006.1016.部分A+B
    C++自定义sort函数
    VS2017如何使用scanf函数
  • 原文地址:https://www.cnblogs.com/flowjacky/p/2824851.html
Copyright © 2011-2022 走看看