ページ 11

階乗

Posted: 2012年7月13日(金) 17:39
by 大学
これをプログラミングしなきゃいけないんですけど、わからないんでお願いします。階乗値を求める関数をつくり、それを使用して、「組み合わせ」の個数を調べるプログラムを作る。
・階乗値関数の名前は自由。また、再帰型、非再帰型どちらでもよい。
・nとrとを、scanf()で読み、nCrの値を計算して、表示する。
・nとrの値にかんしては、非負、非零であること、n>rであることと、n<=10であることをたしかめ、正しい数値を入力させる。
例示した、階乗値を求める関数は、0!=1となることを考えていない。0!をも扱えるように改良する。

Re: 階乗

Posted: 2012年7月13日(金) 18:58
by h2so5

コード:

require 'scanf'

# 階乗関数
def factorial(num)
    if num == 0
        1
    else
        (1..num).inject(1){|sum, i| sum * i}
    end
end

n = 0
r = 0

loop do
    puts "Please input n and r:"
    input = scanf('%d %d')
    n = input[0]
    r = input[1]
    if n > 0 && r > 0 && n > r && n <= 10
        break
    else
        puts "Wrong input! Try again."
    end
end

puts "nCr = " + (factorial(n) / factorial(r)).to_s

Re: 階乗

Posted: 2012年7月13日(金) 21:53
by みけCAT
書きました。

コード:

(defun scanf (a) (read))
(defun fact (a) (if (> a 1) (* a (fact (- a 1))) 1))
(loop
	(princ "Input n.")
	(princ #\LineFeed)
	(princ ">")
	(setq n (scanf ()))
	(if (or (< n 1) (> n 10)) 1 (return 0))
	(princ "Wrong n. Input again.")
	(princ #\LineFeed)
)
(loop
	(princ "Input r.")
	(princ #\LineFeed)
	(princ ">")
	(setq r (scanf ()))
	(if (or (< r 1) (not (> n r))) 1 (return 0))
	(princ "Wrong r. Input again.")
	(princ #\LineFeed)
)
(princ "nCr=")
(princ (/ (/ (fact n) (fact (- n r))) (fact r)))
(princ #\LineFeed)

Re: 階乗

Posted: 2012年7月13日(金) 22:11
by nil
丸投げは禁止ですフォーラムルールを御覧ください。
>「組み合わせ」の個数
なんの組み合わせですか
>例示した
どこに例示してあるのですか
>0!=1となることを考えていない
これの指す意味がわかりません

Re: 階乗

Posted: 2012年7月13日(金) 22:52
by たいちう
>0!=1となることを考えていない
これの指す意味がわかりません
0の階乗は1と定義されていますので、その事ではないかと。