C - 简化置换算法

时间:2014-09-12 02:08:57

标签: c algorithm permutation simplify

如何简化此代码以完成相同的输出。输出是每个可能的字符串取决于长度和变量限制,如a - z将是26个可能的变量,字符串中的字符串长度为3,例如aaa,aab,aac ..... aaz,aba ,abb ...... zzz

//#define 'char_set_begin' 'char_begin'
//#define 'char_set_end' 'char_end'

#define numeric_b '0'
#define numeric_e '9'
/** init string intervals ---*/
static char c0=numeric_b;
static char c1=numeric_b;
static char c2=numeric_b;
static char c3=numeric_b;
static char c4=numeric_b;
static char c5=numeric_b;
static char c6=numeric_b;
static char c7=numeric_b;
/** init start & end ----------------*/
static const char en = numeric_e +1;
static const char st = numeric_b +1;

void str_in(int length);
void permute(int length);

#include <stdio.h>

int main()
{
    int x=5;

    permute(x);

    return 0;
}


void str_in(int length){

FILE *f;
f=fopen("C:\\file\\path\\goes\\here\\fileIO.txt", "a+");


    switch(length){
        case 0:
            fprintf(f,"%c\n",c0);break;
        case 1:
            fprintf(f,"%c%c\n",c0,c1);break;
        case 2:
            fprintf(f,"%c%c%c\n",c0,c1,c2);break;
        case 3:
            fprintf(f,"%c%c%c%c\n",c0,c1,c2,c3);break;
        case 4:
            fprintf(f,"%c%c%c%c%c\n",c0,c1,c2,c3,c4);break;
        case 5:
            fprintf(f,"%c%c%c%c%c%c\n",c0,c1,c2,c3,c4,c5);break;
        case 6:
            fprintf(f,"%c%c%c%c%c%c%c\n",c0,c1,c2,c3,c4,c5,c6);break;
        case 7:
            fprintf(f,"%c%c%c%c%c%c%c%c\n",c0,c1,c2,c3,c4,c5,c6,c7);break;
    }

fclose(f);

}
void permute(int length){

    while(c0<=en){
        str_in(length);
        c0++;
        if(c0==en && length==0){break;}
        if(c0==en){
            c0=st;
            c1++;
            if(c1==en && length==1){break;}
            if(c1==en){
                c1=st;
                c2++;
                if(c2==en && length==2){break;}
                if(c2==en){
                    c2=st;
                    c3++;
                    if(c3==en && length==3){break;}
                    if(c3==en){
                        c3=st;
                        c4++;
                        if(c4==en && length==4){break;}
                        if(c4==en){
                            c4=st;
                            c5++;
                            if(c5==en && length==5){break;}
                            if(c5==en){
                                c5=st;
                                c6++;
                                if(c6==en && length==6){break;}
                                if(c6==en){
                                    c6=st;
                                    c7++;
                                    if(c7==en && length==7){break;}
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以编写一个带有字符串的函数next,并将其视为一个数字,其数字是允许范围内的字符。添加一个涉及递增最低位,如果那个会溢出,则重置它并递增下一个最低位。

这是一些示例代码,它对限制'a'和'z'进行了硬编码,并且需要一个由所有'a'字符组成的(可变)字符串。把它变成你需要的稍微更一般的形式应该是直截了当的。

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

int next(char *data, int k) {
    while (k >= 0 && data[k] == 'z')data[k--] = 'a';
    return (k >= 0) && data[k]++;
}

int main(int argc, char**argv) {
    char a[] = "aaaaa";
    int n = strlen(a);
    do printf("%s\n", a); while (next(a, n-1));
    return 0;
}