projecteuler题库
https://projecteuler.net/problem=621
https://pastebin.ubuntu.com/p/w2G5bwbJMR/
设T(n)是序号n的三角数
那么所计算的数W就是T(n1)+T(n2)+T(n3)
先不管顺序 设(n1 , n2, n3)是从大到小排列
则有T(n1max)=(W/3),T(n2max)=((W-T(n1))/2)
n1取0到n1max,n2取n1到n2max,
计算W-T(n1)-T(n2)是否为三角数。是则取序数n3
判断n1,n2,n3是否相等全不等记6,有两个相等记3,都相等记1。
相加即为结果。
(defun c:sj ()
(setq nn (getreal "请输入要计算的数:")
a1 (xl nn 3)
)
(setq xn 0
qks 0
)
(repeat (+ a1 1)
(setq an (/ (* xn (+ xn 1)) 2))
(setq tn (xl (- nn an) 2))
(setq yn xn)
(repeat (+ 1 (- tn xn))
(setq bn (/ (* yn (+ yn 1)) 2))
(setq c1 (xl (- (- nn an) bn) 1))
(setq qh (+ (+ an bn) (/ (* c1 (+ c1 1)) 2)))
(if (= qh nn)
(setq qks
(+ (if (= xn yn)
(if (= yn c1) 1 3)
(if (= yn c1)
3
6
)
)
qks
)
)
)
(setq yn (+ yn 1))
)
(setq xn (+ xn 1))
)
(princ "G(")
(princ (rtos nn))
(princ ")=")
(princ qks)
(princ)
)
(defun xl (n l)
(- (fix (/ (+ 1 (expt (+ 1 (* 8 (/ n l))) 0.5)) 2)) 1)
)