0-5までの数字を使用して
3~10個の数字の組合せを作成したいと思っています。
組合せを書きだしてみたり、
数学やプログラムのページをネットで探してみたのですが
理解力不足でロジックが思いつきませんでした…。
桁数、使用数字の最大値を指定して、
最終的に配列等に持たせる事が目標です…。
3桁,使用数字の最大値2(0-2)の場合
{0,0,0}
{0,0,1}
{0,1,1}
{0,1,2}
{1,1,1}
{0,0,2}
{0,2,2}
{2,2,2}
といった具合です。(漏れていたらすいません…)
ヒントだけでもいただけたらとても助かります。
宜しくお願いいたします。
No.1ベストアンサー
- 回答日時:
生成するデータに抜けがありますね
000
001
002
011
012
022
111
112 ... 1)
122 ... 2)
222
といった具合になるはずです
この場合3重ループで実現可能です
for i = 0 to 2
for j = i to 2
for k = j to 2
cells(nRow,1) = i & " " & j & " " & k
next
next
next
といった具合です
これだと桁数と使用数字が固定されてしまいます
再帰処理で記述してやれば 桁数、使用数字を可変にできると思いますよ
sub myCalc( lv as integer, m as integer, nMax as Integer, nRow as Integer, ss as string)
if lv = 0 then
' 再帰の脱出条件
Cells( nRow, 1 )= ss
nRow = nRow + 1
ss = left$(ss, Len(ss)-2)
else
dim i as integer
for i = m to nMax
ss = ss & i & " "
' 1つ下のレベルを呼び出す
myCalc lv-1, i,nMax, nRow, ss
next
if len(ss) < 2 then Exit Sub
ss = left$(ss, len( ss ) -2 )
end if
End Sub
といった具合にしておいて
呼び出す側で
myCalc 3, 0, 5, 1, ""
といった具合にします
上記の場合 3桁 0-5を使用 1行目から 初期文字列は"" で呼び出しています
ありがとうございます!
固定のプログラムも、変数呼び出しの再起ロジックも
とても勉強になりました。
教えていただいた考え方を生かして
自分のスキルも上げていきたいと思います。
本当ありがとうございました。
パターン漏れすぎですね…。すいません、、恥ずかしすぎる…。
No.2
- 回答日時:
処理的には「進数変換」と同じですね。
コードのロジックについては「進数変換」で検索してみてください。
Hogeの引数にマイナスや大きな数字を指定したときの対処は組み込んでいません。
Option Explicit
Private Sub CommandButton1_Click()
Call Hoge(5, 5)
End Sub
' Digit .... 桁数
' MaxNum ... 最大値
Public Sub Hoge(Digit As Integer, MaxNum As Integer)
Dim i As Long, l As Long
Dim strPattern() As String
Dim lngVal As Long
Dim lngUseNum As Long ' 数字の種類数 (0-5)なら6
Dim lngUBound As Long ' 配列の上限
' 使用する数字の種類は最大値+1
lngUseNum = MaxNum + 1
' 配列の上限
' (使用する数字の種類 ^ 桁数) - 1
lngUBound = (lngUseNum ^ Digit) - 1
ReDim strPattern(lngUBound)
' 進数変換ループ
For i = 0 To lngUBound
lngVal = i
' 各桁の数値を算出
For l = 0 To (Digit - 1)
strPattern(i) = CStr(lngVal Mod lngUseNum) & " " & strPattern(i)
lngVal = lngVal \ lngUseNum
Next
' 結果を見るためにListBoxへ出力
Call ListBox1.AddItem(strPattern(i))
Next
End Sub
なるほど!!!ありがとうございます!
進数変換、自分では絶対にたどり着かなかったと思います。
本当にありがとうございます。
ロジック使わせていただきます!
本当に勉強になりました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 南京錠 2 2023/02/04 11:46
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- Java Java モンスターブリーダー 1 2023/02/05 09:44
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- Visual Basic(VBA) 列の最終行までのセルと1つ隣のセルの合計を別の列に表示 2 2022/07/12 19:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
三項でたとえば交換って
-
Excel VBAでsub,dimは何の略?
-
Functionの戻り値を配列にした...
-
VB.NETでのイベントの途中終了
-
テキストボックスかラベル上の...
-
C#のループでtextboxに値を入れ...
-
エクセルVBAでテキストボッ...
-
C言語のサフィックスについて
-
他のフォームから別のフォーム...
-
subsequentとnextの違いってな...
-
VBAでcallで呼び出したsubを終...
-
チェックボックスを操作できな...
-
タイムアウトする仕組みを作りたい
-
String型の値にスラッシュをつ...
-
Excel ユーザーフォームで計算 ...
-
VB
-
VBAで入力数値について
-
WORd VBA 文章を単語に分解する
-
C++のActiveX DLLでポインタを...
-
VBA public変数はどのようなこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
三項でたとえば交換って
-
Functionの戻り値を配列にした...
-
Excel VBAでsub,dimは何の略?
-
xmlの値を配列変数に格納し...
-
VB6で配列を引数にするときの2...
-
配列に複数の値があるか簡潔に...
-
2次元配列のデータをファイルへ...
-
xmlの値を配列に格納したいんで...
-
ExcelVBAで他のファイル(proje...
-
VBA public変数はどのようなこ...
-
C#のループでtextboxに値を入れ...
-
VBAでcallで呼び出したsubを終...
-
他のフォームから別のフォーム...
-
C言語のサフィックスについて
-
レコードセットにnullの場合
-
エクセルVBAでテキストボッ...
-
プログラムの素朴な質問です 分...
-
VB.NETでのイベントの途中終了
-
sublimit textっていうエディタ...
-
アクセスできない保護レベルエ...
おすすめ情報