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

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



n高橋です。ちょっとの間にずいぶん進んでいますね。

Reiko TAKAHASHI  (高橋玲子)writes:

> }  ええん、(float)同士で割ったら、割り切れる場合は答えも整数になるのかなと
> } 思ったら、ならないんですね……。
> } どうしよう……。

井上さんが書いていたように % という関数を使うのが普通です。

>  どさくさで、
> (not (= (/ x y) (/ (float x) y)))
> としてみました。

やり方は何通りもあると思いますが、これは初めて見るパターンです。よく思
い付きましたね。

余談ですが、% を使わずに割り算の余りを求める場合の常套手段は、

(- x (* (/ x y) y))

です。もし (/ x y) が割り切れるなら、それに y を掛けた (* (/ x y) y) 
は元の x と同じになり、そうでないなら(* (/ x y) y) は余りの分だけ元の 
x より小さくなる、ということを利用しています。昔の BASIC なんかでよく
使いました。

Reiko TAKAHASHI  (高橋玲子)writes:

>  髪の毛を乾かしていたら、とんでもなく無駄なことをやっていたのに気づきま
> した。
> 絶対割れるはずのない数で割っていた……。

まずは正しく動作するプログラムを作り、次にそれを改良する、という基本パ
ターンをちゃんと押さえてますね。いい傾向です。

> (let ((x 1000) (y 500))
>   (while 
>       (> x 2)
>     (while 
> 	(and (> y 1)  
> 	     (not (= (/ x y) (/ (float x) y))))
>       (setq y (- y 1))
>       (when (= y 1) (print x))) 
>     (setq x (- x 1))
>     (setq y (+ (/ x 2) 1)))
>   (print 1))

井上さんの御指摘どおり、答に2が含まれないようですが、それ以外は合って
いるようですね。あと、普通1は素数と考えません。まあこれは定義の問題で
すが。

それじゃあ次に、(primes n) とするとnまでの素数を全部求め、それをリスト
にして返すような関数 primes を作ってみて下さい。最初の方で 

(let ((answers nil))

とやっておいて、素数がみつかるたびに

(setq answers 
      (cons x answers))

とする、というのがヒントです。

# なんだかすっかり先生気分になってるなあ。

-- 
TAKAHASHI Naoto
ntakahas@...
http://www.m17n.org/ntakahas/