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

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



 r高橋です。

Reply Koichi INOUE <inoue@...>'s message:

} >  割り算の答えを小数で出す(というか、割り切れるかどうかを知る)には、ど
} > んな関数を使えばいいですか?
} 
} (% x y)
} 
} きっとプログラムをかじったことがないと思いつきません。
} 数学だとmodというやつですね。

 ……ええん、modなんて、factorialよりさらに聞いたことがありません(^^;;;)
。
でも、余りを教えてくれるのが(%)関数なんですね。

} printの代わりに
} (insert (format "%s\n" なになに))
} とすれば今いるバッファに入ります。

 やってみました。
ふつう、なにかを表示させたいときには、この形式を使うのが一般的ですか?

} > あと、3以下の数でずるをしています。どうしたらいいか、わかりません。
} 
} 悔しいので自分でもつくってみて試したのですが、3以下はずるをした方がいい
} みたいでした。

 2以下でなく、3もずるしてしまっていいんですよね……?
なんかちょっとだけ気持ち悪い……。

} 最後にisprimeをつけます。

 (そんなことできないとは思うけれど)井上さんのを見ると、考えずに真似し
たくなってしまいそうなので、まだ見ていません。
もう見たほうがいいと思ったらそう言ってください。

} 後、気がついたこととしては、
} 大きな数からわり算を始めていますが、3とかの小さい数で割り切れることがほ
} とんどであることを考えると小さい方からやるのがよいみたいです。実際実行時
} 間がずいぶん違うようでした。(Pentium III/450MHzで体感できた)

 これはやってみました。あと、

} せっかく先に偶数チェックをしておきながら、ループの中でも2の倍数で割ってま
} した。

も、はっとしました。偶数は必ず2で割れてしまうから、素数にはなり得ないんで
すね! 気づかなかった……。

----------
(let ((x 1000) (y 3))
  (while 
      (or (> x 3) (/= (% x 2) 0))
    (while 
	(and (<= y (+ (/ x 2) 1))  
	     (/= (% x y) 0))
      (setq y (+ y 1))
      (when (= y (+ (/ x 2) 1)) 
	(insert (format "%s\n" x)))) 
    (setq x (- x 1))
    (setq y 3))
  (insert (format "%s\n" 3))  
  (insert (format "%s\n" 2)))
----------


Reply TAKAHASHI Naoto <ntakahas@...>'s message:

} >  どさくさで、
} > (not (= (/ x y) (/ (float x) y)))
} > としてみました。
} 
} やり方は何通りもあると思いますが、これは初めて見るパターンです。よく思
} い付きましたね。

 おそろしく力任せですよね(^^;)。でも、思いついたときはちょっとうれしかっ
たです。

} 余談ですが、% を使わずに割り算の余りを求める場合の常套手段は、
} 
} (- x (* (/ x y) y))
} 
} です。もし (/ x y) が割り切れるなら、それに y を掛けた (* (/ x y) y) 
} は元の x と同じになり、そうでないなら(* (/ x y) y) は余りの分だけ元の 
} x より小さくなる、ということを利用しています。昔の BASIC なんかでよく
} 使いました。

 なるほど!! 便利な関数がなくても、こんなふうに工夫できたりするんです
ね。

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

 3とか2は、とても悩ましいです。どうすればいいんでしょう……?
1は素数ではなかったんですね。ずるが一つ減らせてうれしいかも。

} それじゃあ次に、(primes n) とするとnまでの素数を全部求め、それをリスト
} にして返すような関数 primes を作ってみて下さい。最初の方で 
} 
} (let ((answers nil))
} 
} とやっておいて、素数がみつかるたびに
} 
} (setq answers 
}       (cons x answers))
} 
} とする、というのがヒントです。

 あちゃあ、consを使うんですね。
しばし時間を……。

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

 私はすっかり生徒気分になっています。
というか、先生になってくださってありがとうございます!


**-***-***-***-***-***-***-***-***-***-***-***-**
           Reiko TAKAHASHI  (高橋玲子)
         E-mail:  HFC03614@...
         ICQ UIN: 85924121  (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**