2016-11-20 14 views
-2

Cで、文字「A」、 "、" T "。つまり、 AAAAA、 AAAAG、 AAAAC、 など これらは配列に格納する必要があります。私は可能な1024の組み合わせがあることを知っているので、配列はそれを念頭に置いて割り当てられます。 私は、メモリの割り当ては次のようになりますと思う:すべての可能な組み合わせで、このような配列を埋める方法について4文字のすべての可能な文字列の組み合わせを生成する方法C

char* combinations[] = calloc(1024, 5*sizeof(char)); 

わかりません。

+1

私はあなたの文字列が5つの文字を含むように意図されている場合は、少なくとも* 6 *長い文字が –

+0

再帰的な解決策があるのヌルターミネータを保持するように、文字列が必要であることを指摘しますおそらく5つのネストされたループよりも好ましいでしょう。 –

+2

あなたは、試していない他の人のためのコードを書くことを楽しんでいると思います。 –

答えて

2

次のコードは、あなたが望むことをします。

#include <stdio.h> 
#include <stdlib.h> 

// type to encapsulate our 5 character long string 
typedef char combination[5]; 

combination* getCombinations() 
{ 
    char letters[] = {'A','C','G','T'}; 
    combination * combinations = (combination *)calloc(1024, sizeof(combination)); 
    unsigned i; 
    unsigned int j; 

    for (i = 0; i < 1024; i++) 
    { 
    /*combinations[i] = &strings[i * 5];*/ 
    for (j = 5; j--;){ 
     combinations[i][(4 - j)] = letters[(i >> (j * 2)) % 4]; // 
    } 
    } 

    return combinations; 
} 

int main() 
{ 
    int i; 
    combination * combinations = getCombinations(); 
    for (i = 0; i < 1024; i++){ 
    printf("%.*s\n", 5, combinations[i]); 
    } 

    free(combinations); 
} 

重要ラインが内部ループである:

combinations[i][4 - j] = letters[(i >> (j * 2)) % 4]; 

この行の目的は、単純にカウントすることによって組み合わせへのインデックス(0〜1023)をオンにすることです。

はこれを打破するのをしてみましょう:

  • letters[... % 4]は何でも(...)に基づいて文字を返します。値を設定combinations[i][4 - j]ただ、159でインデックスを作る...すべてが'C'

  • を返す
  • (i >> (j * 2))これは基本的に私たちは基本4(可能な文字の数)で選択することができます% 4一部

  • リストのi番目の単語のj番目の文字(右側から数えて)に移動します。私たちは、アルゴリズムを使い始める前に

1
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

void f(char** out, int n, char* p) 
{ 
    if (n == 0) { 
     memcpy(*out, p - 5, 5); 
     *out += 5; 
     return; 
    } 
    for (int i = 0; i < 4; ++i) { 
     *p = "ACGT"[i]; 
     f(out, n - 1, p + 1); 
    } 
} 

int main() 
{ 
    char* combinations = calloc(1024, 5); 
    char* comb = combinations; 
    char buf[5]; 
    f(&comb, 5, buf); 

    for (int i = 0; i < 1024; ++i) 
    printf("%.5s\n", combinations + i * 5); 
} 
関連する問題