アプリ版:「スタンプのみでお礼する」機能のリリースについて

If文やForNext構文を駆使して階乗、順列、組み合わせの計算を実現する関数を作りたいです。どのように考えてどのようなプログラムを書けばよいか教えてください!

A 回答 (3件)

まず大事なのは、階乗・順列・組合せの計算を具体的に記述することです。



それが出来れば、後はその考え方をコードにするだけです。

例:(あくまでも一例)
Public Sub kaijo()
Dim i As Integer
Dim j As Long
j = 1
For i = Cells(1, 1).Value To 1 Step -1
j = j * i
Next i
Cells(1, 2).Value = j
End Sub

これで、A1に入っている数字の階乗の計算結果をB1に表示できます。

見本にもなっていませんが、こういう感じで作っていけばいいかと…。
    • good
    • 0

順列。

組み合わせともに公式に、階乗が現れてきます。
階乗は
Sub test01()
n = 1
For i = 1 To 17
n = n * i
Cells(i, "A") = n
Next i
End Sub
のようにすれば計算されますが、エクセルの画面のセルに表示は上記ぐらいが限度です。
ですから用途については、非常に限られています。エクセルは不向きでしょう。
これ以上を考えるなら、数学的アルゴリズムの考察が難しく、この質問振りからでは、そちらの知識のほうが追いつかないのでは。
ーー
質問が漠然としすぎ。
多桁、近似の計算のアルゴリズムなどに習熟しているか
まず後者の習得でしょう。
私は知らないが、理系の研究などでは、既成の専門ソフトを使うのでは。
素人が安易に作ると危ない。
    • good
    • 1

階乗については、


Function Fact(n) as long
Fact = 1
for i = 1 to n
Fact = Fact * i
next i
End Function
で最低限のものは実現できます。 最低限という意味は、エラーが起きたときの対応ができていないということです。
例えば、負の数を引き渡したときは、1が返されます。
また、171以上の数を引き渡すと、オーバーフローしますし、
longの定義上正確に計算できるのは、17までだと思います。

組み合わせについても、
Function Combi(n,r) as long
Combi = Fact(n)/(Fact(r)*Fact(n-r))
End Function
で最低限のものは作れますが、やはりFactの制限に引っかかります。
factというファンクションを使わなければ、
ループを使い
n(n-1)(n-2)(n-3)・・・(n-r+1)/r!
を計算することによって、多少は上限が増えますが、どの時点で正確でなくなるのか、どの時点でオーバーフローするのかなどを検証しておく必要はあります。

それよりも完成度の高いものを目指す場合は、数自体の構造体を自分で作り、それらを演算させるプログラムを組まなくてはいけません。演算する速度は遅くなりますが、VBAで作れないわけではありません。

何にしても、計算の上限値はどこかに設定しておかなくてはいけませんし、上限を越した際のエラー処理の方法を考えておく必要があります。 
    • good
    • 1
この回答へのお礼

詳しい説明をどうもありがとうございました。おかげで疑問が解決しました!

お礼日時:2007/10/08 22:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています