C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 25 を表示中)
■11078 / )  Re[7]: 関数作成
□投稿者/ ID非公開 (1回)-(2007/12/06(Thu) 15:24:52)
 初めて投稿します。

 επιστημη さんのアルゴリズムで書いていけばよいと思います。
(私にはとても考え付きませんでした・・・)

> N文字あるとき、1~2^N-1 の数を二進表現にすりゃいいんじゃね?
> 
> あいう
> 001 = う
> 010 = い
> 011 = いう
> 100 = あ
> 101 = あう
> 110 = あい
> 111 = あいう


ちなみに、
>【追記】コードにコメントいれマス。このビット判定も数に限界ありマスね。


 この点は問題ないと思います。
 なぜなら、32ビットでも組み合わせの数は40億通りを越えるので、
 結果を格納する文字列のサイズが4GBを遥かに超えてしまうためです。


 ためしに作ってみたコードを提示します(VBですが・・・)

 この関数は
「あ い う え」を渡すと
「あ い あい う あう いう あいう え あえ いえ あいえ
 うえ あうえ いうえ あいうえ」を返します。


   Public Shared Function Sample01(ByVal input As String) As String

        '全角スペースは半角に変換
        input = input.Replace(" ", " ")

        '配列に分割(空要素は入らない)
        Dim sep() As String = {" "}
        Dim Allinput() As String = input.Split(sep, StringSplitOptions.RemoveEmptyEntries)

        Dim cnt As Integer = Allinput.Length
        If cnt >= 33 Then Throw New ArgumentException("要素の数は32個以内にしてください")
        Dim sb As New StringBuilder

        'ここからメインの処理
        For src As UInt32 = 1 To Convert.ToUInt32(2 ^ cnt - 1)

            Dim mask As UInt32 = 1

            For i As Integer = 1 To cnt

                'ビットが立っていれば文字を追加
                If (src And mask) = mask Then
                    sb.Append(Allinput(i - 1))
                End If
                '型変換しないとエラーになる(なぜ?)
                mask = Convert.ToUInt32(mask * 2)

            Next

            sb.Append(" ")

        Next

        Return sb.ToString

    End Function


以上です。

返信 編集キー/


管理者用

- Child Tree -