[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bep] 割り算の答えを小数で出すには? <Re: learning lisp: while
- To: bep@argv.org
- Subject: Re: [bep] 割り算の答えを小数で出すには? <Re: learning lisp: while
- From: TAKAHASHI Naoto <ntakahas@m17n.org>
- Date: Sat, 7 Jul 2001 14:32:43 +0900 (JST)
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
- User-Agent: SEMI/1.14.3 (Ushinoya) FLIM/1.14.2 (Yagi-Nishiguchi) APEL/10.2 Emacs/21.0.104 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI)
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/