2011-01-21 23 views
7

Tôi đã cố gắng mã hóa bản thân mình và thất bại khủng khiếp. Về cơ bản đây là những gì tôi muốn:Tạo tất cả các chuỗi theo chiều dài N trong C

a 
b 
... 
z 
aa 
ba 
... 
za 
ab 
bb 
... 
zz 
aaa 
baa 
... 
zzz 

Cuối cùng, nó sẽ tạo ra mọi chuỗi ngắn hơn N ký tự bảng mã a-z. Vì vậy, tôi không tìm kiếm hoán vị (trong đó 1001 triển khai có thể được tìm thấy trên internet), nhưng đối với kết hợp với thay thế (ít nhất đó là cách nó được gọi là trong Python). Thứ tự không quan trọng, tốc độ là.

+2

Bạn chưa đủ cụ thể. Cũng giống như bạn đã tạo "trừu kêu", bạn cũng sẽ tạo "aba", "abb" và "aab"? –

+1

@John Feminella: Có – orlp

Trả lời

9

Hình như bạn muốn nó trong C, đây là một cách để làm điều đó:

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

int inc(char *c){ 
    if(c[0]==0) return 0; 
    if(c[0]=='z'){ 
     c[0]='a'; 
     return inc(c+sizeof(char)); 
    } 
    c[0]++; 
    return 1; 
} 

int main(void){ 
    int n = 3; 
    int i,j; 
    char *c = malloc((n+1)*sizeof(char)); 
    for(i=1;i<=n;i++){ 
     for(j=0;j<i;j++) c[j]='a'; 
     c[i]=0; 
     do { 
      printf("%s\n",c); 
     } while(inc(c)); 
    } 
    free(c); 
} 
+1

Điều đó gần như hoàn hảo, nó chỉ bỏ qua lần lặp đầu tiên (a, aa, aaa). Thay đổi 'while (inc (c))' thành 'do ... while();' loop cố định điều đó. Cũng không có lý do gì để sử dụng 'malloc' ở đây, vì tôi sẽ không đặt trước megabyte (không kể chúng ta không nên bỏ' malloc' vào C). Khác sau đó những chi tiết nhỏ được hưởng câu trả lời chấp nhận của bạn và +1 :) – orlp

+0

Tốt bắt, tôi cố định điều làm trong khi. Đối với đúc malloc, đó có lẽ là vì tôi đã học C với một số trình biên dịch kiểu cũ đã phàn nàn khi tôi không ... –

3

Something như thế này (giả):

void CompWithRep(string line,int N) { 
    char c; 
    if (N==0) return; 
    for (c = 'a' ; c <= 'z' ; c++) 
    { 
    printf(line + c); 
    CompWithRep(line + c,N-1); 
    } 
} 
+0

Bạn đang trộn các biến c, i và a. – marcog

+0

Yea, không biết đó là tất cả về lol ... cố định –

+0

@Yochai, hãy nghiên cứu dòng này 'cho (c = 'a'; c <26; C++)' và nghiên cứu [ascii table] (http : //www.asciitable.com/). – orlp

Các vấn đề liên quan