有关projecteuler题库621题的lisp解答,萌新求围观。

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)
)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值