プロが教える店舗&オフィスのセキュリティ対策術

階乗のマクロを作りたいのですが、全然できません。どこを変えたらいいのか教えて下さい。ちなみに今こうなっています。
------------------------------------------------
Sub exam5()
Dim intA As Integer
Dim intB As Integer
Dim intC As Integer
intA = Application.InputBox("数値を入力してください。")
intB = (intA - 1)
intC = (intA) * (intB)
MsgBox (intC)
End Sub

Function kaijou(intA As Integer, intB As Integer) As Integer
kaijou = intA * intB
End Function
------------------------------------------------
どうかお願いします。

A 回答 (6件)

No.4です。



> kaijou = intn * intn - 1

が惜しいですね。

この↑計算ですと、
「n かける n ひく 1」
括弧を忘れているのだとしても、
「n かける (nひく1)」
になってしまいます。


階乗の定義は、
n!=n×(n-1)!
「n かける (n-1)の階乗」

ですので…

--
もうちょっとヒントを書くと、

5!=5×4!
4!=4×3!
3!=3×2!
2!=2×1!
1!=1×0!
0!=1

と言う風に順番に計算します。
この場合はループの処理は必要なくなります。

--
Function kaijou(n As Integer) As Integer
のつもりで「int」は誤記でした。intnと読み替えて頂いてOKです。
    • good
    • 1

No.2の-boya-です。


学習中ということで、丸々回答ではなくアドバイスを。
アドバイスを「'」の行に追記しましたので参考に。

Sub exam6()
Dim intn As Integer
'intAも定義した方がよいです。
intn = Application.InputBox("数値を入力してください")
intA = kaijou(intn)
MsgBox (intA)
End Sub

Function kaijou(intn As Integer) As Integer
'↑intnが大きくなった場合、返ってくる値がIntegerの範囲(-32,768 ~ 32,767)
'を超えてしまう場合があるので、もう少し大きい方がいいと思います。
If intn <> 0 Then
'↑「intnが0じゃ無かったら」の意味なので、この場合は逆です。
  kaijou = 1
Else
  kaijou = intn * (intn - 1)
  '↑追記したように括弧が必要。
  'コレでは1度しか掛け算をしていないので、繰り返す必要があります。
  '先ほど書いた「Do ~ Loop」等を使って繰り返し掛け算をします。
  'n! = n × (n-1) × ((n-1)-1) × (((n-1)-1)-1) ・・・ ×1
  'と言うように、掛け算を1になるまで繰り返される様にします。
End If
End Function
    • good
    • 0

階乗:


5!=5×4×3×2×1=120
ですね。

例題とかだと再起呼び出しが使われますね。
n!=n×(n-1)!
ただし、
0!=1(←って定義だっけ?

Function kaijou(int n As Integer) As Integer
if n<>0 then
  kaijou = ~
 else
  kaijou = ~
 endif
End Function

の書き方だとどうなるか、考えてみてください。

この回答への補足

このように考えてやってみたのですがうまくいかないです。どこが悪いんでしょうか?
------------------------------------------------
Sub exam6()
Dim intn As Integer
intn = Application.InputBox("数値を入力してください")
intA = kaijou(intn)
MsgBox (intA)
End Sub
Function kaijou(intn As Integer) As Integer
If n <> 0 Then
kaijou = 1
Else
kaijou = intn * intn - 1

End If
End Function

補足日時:2003/11/17 15:40
    • good
    • 0

エクセルでやれることはエクセルでということであれば


階乗はワークシート関数を使えば手っ取り早いんですが。
re=InputBox("数字")
MsgBox (Application.WorksheetFunction.Fact(re))

まぁ2番さんのようにコードで自作する方がアルゴリズムの勉強にはもってこいかと思いますが。
    • good
    • 0

階乗の計算であれば、繰り返す必要がありますね。


例えばこんな感じで、、、


Dim intA As Integer
Dim ans
ans = 1
intA = Application.InputBox("数値を入力してください。")
Do Until intA = 0
ans = ans * intA
intA = intA - 1
Loop
MsgBox ans

あくまで、InputBoxで入力される値が正の整数であると
いう前提で書いてます。それ以外であるかどうかの
チェックなどは省いてます。
あと、階乗計算の結果がIntegerの範囲を超えてしまう
場合があることも考慮した方がいいと思います。

以上、簡単ですが。

この回答への補足

関数を使いたいのでFunction~をつかうとどうなるのでしょうか?

補足日時:2003/11/17 15:42
    • good
    • 0

 それではただのかけ算です。


階乗演算子は「^」です。

この回答への補足

「*」を「^」に変えてみましたがうまく階乗の値が出ません。他にどこに問題があるでしょうか。

補足日時:2003/11/17 14:04
    • good
    • 0

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

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