首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Permutation置换算法

Permutation置换算法
EN

Stack Overflow用户
提问于 2014-09-12 02:08:57
回答 1查看 120关注 0票数 0

如何简化此代码以完成相同的输出。输出是每个可能的字符串取决于长度和变量限制,就像aab将是26个可能变量在一个字符串中的长度为3,例如是aaa,aab,aac……啊哈,阿坝,神甫.zzz

代码语言:javascript
复制
//#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;}
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-12 02:50:37

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

下面是一些示例代码,它对限值'a‘和'z’进行硬编码,并需要一个(可变的)字符串,该字符串由所有'a‘字符组成。将其转化为您需要的稍微一般的形式应该是简单明了的。

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25799675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档