(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))
答案 0 :(得分:0)
n-1
不是lisp。试试(- n 1)
您的循环中需要do
。那就是:
(loop for i from 2 to (- n 1) do ...
换句话说:
(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))
答案 1 :(得分:0)
n-1
是一个符号,在您的情况下,它是一个未绑定的符号(也就是说,它没有值,因此)。您可能是(- n 1)
或(1- n)
中的一个(它们都具有“从n中减去一个”的值)。
一般情况下,您不需要遍历低于n
的所有数字,只需循环到(isqrt n)
(数字的整数平方根,如果您是正数,则为正平方根)看一个正方形数字,并且总是至少与非素数的因子一样大。)
不是使用标志变量并设置它们,而是将primality检查器包装在函数中,并在早期找到一个因子返回。
(defun primep (n)
(loop for i from 2 upto (isqrt n)
if (zerop (mod n i))
do (return-from primep nil))
'prime)