2011-11-10 9 views
1

数字の可能な組み合わせをすべてどのように生成することができますか?たとえば、私はこれを持っている場合arrayOfNumbers = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;数字の組み合わせを生成するためのコードのレビュー

できるだけ多くの6数字の組み合わせを生成する必要があります。

これらの組み合わせは、私に、私はいくつかの非常に簡単コードを思い付く1,2,3,4,5,6 == 1,3,2,5,4,6;

に同じですが、私はこのコードははるかに良いようにしたいと思います。 maximumPossibilitiesと宣言せずに何とかしてもいいですか?総数は時々異なる場合がありますが、1から48までです。 countOfNumbersForPlayは、6〜11と異なる場合があります。

+ (NSArray *)generateNumbers{ 

    int MAX_POSSIBILITIES = 7; 
    int COUNT_OF_NUMS_FOR_PLAY = 6; 

    NSMutableArray *results = [NSMutableArray array]; 

    NSArray *numbers = [NSArray arrayWithObjects:[NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:3], [NSNumber numberWithInt:4], [NSNumber numberWithInt:5], [NSNumber numberWithInt:6], [NSNumber numberWithInt:7], nil]; 

    int i = 0; 
    do { 

     int x = 0; 

     NSMutableArray *temp = [NSMutableArray array]; 

     do { 

      int randomIndex = rand() % numbers.count; 

      if (![temp containsObject:[numbers objectAtIndex:randomIndex]]) { 
       [temp addObject:[numbers objectAtIndex:randomIndex]]; 
       x++; 
      } 

     } while (x < COUNT_OF_NUMS_FOR_PLAY); 

     NSArray *sortedArray = [temp sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
      if ([obj1 intValue] < [obj2 intValue]) { 
       return NSOrderedAscending; 
      } else if ([obj1 intValue] > [obj2 intValue]) { 
       return NSOrderedDescending; 
      } else { 
       return NSOrderedSame; 
      } 
     }]; 


     if (![results containsObject:sortedArray]) { 
      [results addObject:sortedArray]; 
      i++; 
     } 

    } while (i < MAX_POSSIBILITIES);  

    return results; 
} 
+0

これはC++コードですか? –

+0

http://ja.wikipedia.org/wiki/Combination - それはあなたが欲しいものですか? – n0rd

+0

はい、私が必要とするものですが、どうすればxcode C++でそれを行うことができますか?私の解決策は私にとっては十分ではありません。 – user1040420

答えて

0

から456789までを数えれば、数字0..9の可能なすべての組み合わせを通過することになります。あなたのルールでは、前の桁が後の桁(例えば、103456)と等しいかそれより大きい任意の数字です。つまり、カウントの200000から234567にスキップすることができます。

任意の「数字」を一般化することは、そこからかなり単純な問題です。 "数字"を保持する配列を作成します。各配列要素は1つの「数字」です。次に、桁がその上限を超えてインクリメントされたときに下限にリセットされ、 "キャリー"が次の上位桁をインクリメントするインクリメントルールを実装する必要があります(普通の算術のように)。ただし、この方法でインクリメントすると、現在の桁の新しい値は、左にインクリメントした桁よりも必然的に少なくなります(上限を超えてインクリメントされていない限り)ので、現在の桁左の桁の値に1桁を加え、右の桁を現在の桁の後の値が大きくなるように設定します。

各増分の結果は、生成される値の1つです。

0

ダニエルは上記と同様の解決策を示していますが、このように私は概念的にこのような問題を捉えています。

alphaという文字のアルファベットがあるとします。この例では、アルファベット= {1,2,3,4,5,6}とします。この場合のアルファベットの長さは6です。

あなたは、このアルファベットで6^kの有効な長さの数字があることを理解しています。あなたはすべての文字が一意であることを確認しているので、実際にチェックすることができます。

[0..6^k]のすべてのiについて基本的にiを6に変換します。数字以外のアルファベットそれぞれの文字をアルファベットのインデックスに変換できるようになりました。

関連する問題