下記が、組み合わせを求めるプログラムです。
これのどこを変更すれば、順列を列挙するプログラムになりますか(ただし、重複順列でない。例、5P2=5*4=20通り)?教えていただけませんか?
Public Class Form1
Dim w0, w1, count As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Text = "コンビネーションサーチ"
Label1.Text = "個の中から"
Label2.Text = "個とる組リスト"
Button1.Text = "計算"
TextBox1.Text = "6"
TextBox2.Text = "3"
TextBox3.Text = ""
TextBox3.ScrollBars = ScrollBars.Vertical
count = 0
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim n, m As Integer
n = TextBox1.Text
m = TextBox2.Text
w1 = " }"
w0 = "{ "
TextBox3.Text = ""
count = 0
combisearch(1, n, m)
MsgBox("組み合わせ個数は、" & count & "個です。")
End Sub
Sub combisearch(ByVal st, ByVal ed, ByVal depth)
Dim i, temp
If depth - 1 < 1 Then
For i = st To ed
TextBox3.Text &= w0 & i & w1 & vbCrLf
count += 1
Next
Else
For i = st To ed
temp = w0
w0 &= i & " "
combisearch(i + 1, ed, depth - 1)
w0 = temp
Next
End If
End Sub
End Class
No.5ベストアンサー
- 回答日時:
ANo2~5です。
すいませんが、これまでのは、廃棄願います。
Public Class Form1
Dim w0, w1, count As String
dim w2 As String '★追加
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Text = "コンビネーションサーチ"
Label1.Text = "個の中から"
Label2.Text = "個とる組リスト"
Button1.Text = "計算"
TextBox1.Text = "6"
TextBox2.Text = "3"
TextBox3.Text = ""
TextBox3.ScrollBars = ScrollBars.Vertical
count = 0
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim n, m As Integer
n = TextBox1.Text
m = TextBox2.Text
w1 = " }"
w0 = "{ "
TextBox3.Text = ""
count = 0
combisearch(1, n, m)
MsgBox("組み合わせ個数は、" & count & "個です。")
End Sub
Sub combisearch(ByVal st, ByVal ed, ByVal depth)
Dim i, temp
If depth - 1 < 1 Then
For i = 1 To ed '★置き換え
'For i = st To ed
If InStr(w2, CStr(i) & " ") = 0 Then '★追加:重複の除外
TextBox3.Text &= w0 & i & w1 & vbCrLf
count += 1
End If '★追加
Next
w2 = "" '★追加
Else
For i = 1 To ed '★置き換え
'For i = st To ed
If InStr(w2, CStr(i) & " ") = 0 Then '★追加:重複の除外
temp = w0
w0 &= i & " "
w2 = w2 & i & " " '★追加
combisearch(i + 1, ed, depth - 1)
w0 = temp
w2 = temp '★追加
End If '★追加
Next
End If
End Sub
End Class
## EXCEL VBAで試しているので
## 書き換えでミスばっかりしてすいません。
5P4=120
と
5P2=20
がうまくいっていたのでたぶん大丈夫かと。
今まで、ご回答ありがとうございました。
おかげさまで、見事順列列挙プログラムが完成しました。
また、プログラムのことで何か困ったことがあれば、ご回答お願いいたします。
No.4
- 回答日時:
あっ、すいません。
combisearch(1, ed, depth - 1 , i)
です。
でも、depth = 2 のときうまくいくはずですが、
depth >2 のときに問題があることに気づいたのでちょっと考え直して改めて回答いれます。
No.3
- 回答日時:
ANo.2です。
>補足
>この方法では、重複順列を許しております。
大変失礼しました。
うっかりミスしていました。
以下の例のようにサブルーチンに除外する数字を渡すことで対応できると思います。
注:-999999999は除外する数字はないという意味。
・・・
combisearch(1, n, m,-999999999)
'combisearch(1, n, m)
MsgBox("組み合わせ個数は、" & count & "個です。")
End Sub
Sub combisearch(ByVal st, ByVal ed, ByVal depth,ByVal myVal)
'Sub combisearch(ByVal st, ByVal ed, ByVal depth)
Dim i, temp
If depth - 1 < 1 Then
For i = st To ed
if i <> myVal then '追加:重複の除外
TextBox3.Text &= w0 & i & w1 & vbCrLf
count += 1
end if '追加
Next
Else
For i = st To ed
if i <> myVal then '追加:重複の除外
temp = w0
w0 &= i & " "
'ここだけ。
combisearch(1, ed, depth - 1)
'combisearch(i + 1, ed, depth - 1)
w0 = temp
end if '追加
Next
End If
End Sub
この回答への補足
2回目のご回答ありがとうございます。
しかし、
permsearch(1, ea, deptha - 1)
の部分で、下記のエラーが出ます。
誠に申し訳ありませんが、どう対処すればよいでしょうか。
教えていただけませんでしょうか。
エラーメッセージ内容 ここから
エラー1
説明:'Public Sub permsearch(sa As Object, ea As Object, deptha As Object, myVal As Object)' のパラメーター 'myVal' に対して引数が指定されていません。
ファイル:G:\順列 & 組み合わせ探索\順列 組み合わせ探索\順列 組み合わせ探
索\Form1.vb
行:150
列:21
プロジェクト:順列 組み合わせ探索
ここまで
なお、stは、saに、edは、eaに、depthは、depthaに変えております。
No.2
- 回答日時:
Sub combisearch(ByVal st, ByVal ed, ByVal depth)
Dim i, temp
If depth - 1 < 1 Then
For i = st To ed
TextBox3.Text &= w0 & i & w1 & vbCrLf
count += 1
Next
Else
For i = st To ed
temp = w0
w0 &= i & " "
'ここだけ。
combisearch(1, ed, depth - 1)
'combisearch(i + 1, ed, depth - 1)
w0 = temp
Next
End If
End Sub
End Class
この回答への補足
ご回答ありがとうございました。
しかし、この方法では、重複順列を許しております。
たとえば、5,2と入力すれば、5*4=20通りとなるのですが、ここでは、25となります。
つまり、(1,1).(2,2).(3,3).(4,4).(5,5)が余計です。
これを省く方法をできれば教えていただけませんでしょうか。
お願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
骨折リスク評価のFRAXについて...
-
VBAでの勤務時間計算
-
正しい値が戻ってきません。ど...
-
[ASP]日付と時間の比較
-
PHPとJavaでSHA256の結果を同じ...
-
バッチファイルでウインドウを...
-
チェックデジット計算できる関...
-
入射角反射角
-
JAVAのプログランミング
-
C言語についてです。 再帰を使...
-
ExcelのVBAで複素数は扱えない...
-
四則演算プログラム(入力式の...
-
[急募]Pythonについてです。
-
C# 計算処理中に実行中ウィン...
-
スパイダソリティアの問題
-
順列のプログラムについて(VB)
-
階乗のマクロ
-
なぜオーバーフローになるので...
-
エクセルのセル式で恐縮ですが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
変化させるセルが変化しない
-
排他的論理和 BCC(水平パリテ...
-
VBAの再計算が反映されない件に...
-
VBAで関数をつくる
-
バッチファイルでウインドウを...
-
モジュラス103の計算とは何でし...
-
EXCELなどで「返す」という表現
-
数値計算の高速化 (cos, sin, exp)
-
傾いた四角形内の範囲の条件式
-
骨折リスク評価のFRAXについて...
-
matlab計算での進捗状況を知りたい
-
Excel VBAにてFFT
-
C言語についてです。 再帰を使...
-
C言語について 下の画像は do-w...
-
アドオン利率を実質年率に変換
-
エクセルで特定のセルのみを任...
-
電卓でmodの計算
-
y=(x^2 +3x+1)^4を微分の定義を...
-
「評価」「評価値」という言葉...
おすすめ情報