階乗

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
大学

階乗

#1

投稿記事 by 大学 » 12年前

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 階乗

#2

投稿記事 by h2so5 » 12年前

コード:

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

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 階乗

#3

投稿記事 by みけCAT » 12年前

書きました。

コード:

(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)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

nil
記事: 428
登録日時: 12年前

Re: 階乗

#4

投稿記事 by nil » 12年前

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

たいちう
記事: 418
登録日時: 13年前

Re: 階乗

#5

投稿記事 by たいちう » 12年前

>0!=1となることを考えていない
これの指す意味がわかりません
0の階乗は1と定義されていますので、その事ではないかと。

閉鎖

“C言語何でも質問掲示板” へ戻る