Q我已经做了一个程序来查找lisp中的素数,但它不起作用
如果您愿意,它将使您的代码更容易让其他人阅读 将在新行中开始每个顶级表单Q我已经做了一个程序来查找lisp中的素数,但它不起作用,lisp,Lisp,如果您愿意,它将使您的代码更容易让其他人阅读 将在新行中开始每个顶级表单 n-1不是lisp。尝试(-n1) 循环中需要一个do。即: (i从2到(-n1)的循环执行… 换言之: (princ "ENTER ANY NUMBER : ") (setq n (read)) (setq flag 0) (loop for i from 2 to n-1 (if (=(mod n i)0) (setq flag 1))) (if (= flag 0) (for
n-1
不是lisp。尝试(-n1)
do
。即:
(i从2到(-n1)的循环执行…
(princ "ENTER ANY NUMBER : ")
(setq n (read))
(setq flag 0)
(loop for i from 2 to n-1
(if (=(mod n i)0)
(setq flag 1)))
(if (= flag 0)
(format t "~d IS A PRIME NUMBER"n)
(format t "~d IS NOT A PRIME NUMBER"n))
n-1
是一个符号,在您的例子中,它是一个未绑定的符号(也就是说,它本身没有值)。您可能是指(-n1)
或(1-n)
中的一个(它们都有“n减去1”的值)
一般来说,您不需要遍历所有小于n
的数字,只需遍历(isqrt n)
(数字的整数平方根,如果您查看的是平方数,这是正平方根,并且始终至少与非素数的因子一样大)
不要使用标志变量并设置它们,而是将素性检查器包装在函数中,并在找到因子之前返回
(princ "ENTER ANY NUMBER : ")
(setq n (read))
(setq flag 0)
(loop for i from 2 to (- n 1) do
(if (= (mod n i) 0)
(setq flag 1)))
(if (= flag 0)
(format t "~d IS A PRIME NUMBER"n)
(format t "~d IS NOT A PRIME NUMBER"n))
为什么它不工作?你得到了什么错误?你期望得到什么输出?
(defun primep (n)
(loop for i from 2 upto (isqrt n)
if (zerop (mod n i))
do (return-from primep nil))
'prime)