Q值。我已经制定了一个程序来查找lisp中的素数,但它不起作用

时间:2016-11-30 15:43:14

标签: lisp

(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))

2 个答案:

答案 0 :(得分:0)

  1. 如果你这样,它会使你的代码更容易让其他人阅读 将在新行上启动每个顶级表单。
  2. n-1不是lisp。试试(- n 1)
  3. 您的循环中需要do。那就是:

    (loop for i from 2 to (- n 1) do ...

  4. 换句话说:

    (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)