【问题标题】:q. i have made a program to find prime number in lisp but it is not working问。我制作了一个程序来在 lisp 中查找素数,但它不起作用
【发布时间】:2017-04-15 00:24:48
【问题描述】:
(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))

【问题讨论】:

标签: lisp


【解决方案1】:
  1. 如果你这样做,它会让其他人更容易阅读你的代码 将在新行上开始每个 顶级 表单。

  2. n-1 不是 lisp。试试(- n 1)

  3. 您的循环中需要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))

【讨论】:

    【解决方案2】:

    n-1 是一个符号,在你的情况下它是一个未绑定的符号(也就是说,它没有这样的值)。您可能指的是(- n 1)(1- n) 之一(它们的值都是“从n 中减去一个”)。

    一般来说,你不需要遍历所有低于n的数字,只需要循环到(isqrt n)(数字的整数平方根,如果你看的是平方,这是正平方根数并且总是至少与非质数的因子一样大。

    不要使用标志变量并设置它们,而是将您的素数检查器包装在一个函数中并尽早返回您找到一个因素。

    (defun primep (n)
      (loop for i from 2 upto (isqrt n)
        if (zerop (mod n i))
        do (return-from primep nil))
      'prime)
    

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2012-04-03
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      相关资源
      最近更新 更多