[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] 割り算の答えを小数で出すには? <Re: learning lisp: while



井上です。

Reiko TAKAHASHI <HFC03614@...> writes:

> (not (= (/ x y) (/ (float x) y)))
> としてみました。

おお、これでも一応大丈夫みたいですね。わり算が2回使われるので%の方がよ
いとは思いますが、よく考えましたね。




> 
>  で、lisp-interaction-modeでは素数らしき数をなんとか表示してくれるように
> なったのですが、そうじゃないとなにも表示してくれません。

いつものように*Message*バッファにでています。
printの代わりに
(insert (format "%s\n" なになに))
とすれば今いるバッファに入ります。

> あと、3以下の数でずるをしています。どうしたらいいか、わかりません。

悔しいので自分でもつくってみて試したのですが、3以下はずるをした方がいい
みたいでした。
最終版とこちらのの答えを比べると、2がない以外は合ってました。たぶん大丈
夫なんでしょう。
ちなみに、私は2重ループから逃げるためにisprimeという関数をつくってそれ
をループで回すというずるをしました。
最後にisprimeをつけます。
最近        こういうタイプのプログラムに弱くなっているので、間違っている
可能性があるのですが。
後、気がついたこととしては、
大きな数からわり算を始めていますが、3とかの小さい数で割り切れることがほ
とんどであることを考えると小さい方からやるのがよいみたいです。実際実行時
間がずいぶん違うようでした。(Pentium III/450MHzで体感できた)

しかし、r高橋さんやりますね。

以下isprimeです。

(defun isprime (x)
  (cond ((= 1 x) t)
	((= 2 x) t)
	((= x 3) t)
	((equal (% x 2) 0)
	 nil)
	(t (let ((i 2)
		 (upper (1+ (/ x 2))))
	     (while
		 (and (< i upper)
		      (> (% x i) 0))
	       (setq i (1+ i)))
	     (if (equal i upper) t nil)
	     ))))

;;;ぐるぐる回す部分:
(let ((i 1))
  (while (<= i 1000)
    (when (isprime i) (print i))
    (setq i (1+ i))))

# ああ恥ずかし

-- 
                    Koichi Inoue, ARGV
                    E-Mail: inoue@...
                    ICQ UIN: 74900690