标题:大神来看看,关于字符全排列,我的代码还能再优化吗?
只看楼主
Y影子Z
Rank: 3Rank: 3
来 自:石家庄
等 级:论坛游侠
帖 子:54
专家分:110
注 册:2012-10-12
结帖率:100%
已结贴  问题点数:10 回复次数:4 
大神来看看,关于字符全排列,我的代码还能再优化吗?
感觉自己写的很麻烦,期待更好的
#include<stdio.h>
#include<string.h>
void change(char *,char*);
void ex(char *,int,int);
int p=0;
int main()
{
    char a[10];
    int k,m=0;
    printf("请输入要排列的字符(至少三个):  ");
    gets(a);
    k=strlen(a);
    ex(a,m,k);
    printf("\n共%d个\n",p);
    return 0;
}
void ex(char *a,int m,int k)
{
    int i,temp;
    for(i=m;i<k;i++)
    {
        temp=a[m];
        a[m]=a[i];
        a[i]=temp;
        if(k-m==3)
        {
            change(a,a+m);
            break;
        }   
        else
        {
            ex(a,++m,k);
        }
        m--;
        temp=a[m];
        a[m]=a[i];
        a[i]=temp;
    }
}
void change(char *a,char *b)
{
    int i,temp;
    for(i=0;i<6;++i)
    {
        temp=b[i%2];
        b[i%2]=b[i%2+1];
        b[i%2+1]=temp;
        printf("%s\t",a);
        p++;
    }
}

[ 本帖最后由 Y影子Z 于 2012-10-27 21:55 编辑 ]
搜索更多相关主题的帖子: return change include 
2012-10-27 21:53
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:5 
如果对输入的顺序没什么要求的话,可以这样写。

其实 sub_traverse 这个函数已经完全可以实现功能。之所以又套了个traverse是为了简化接口。体会一下这么设计的意义。

作为试验我就不多说什么了,实际中尽量不要用gets函数,它不对指针做任何检查。

程序代码:
#include<stdio.h>
#include<string.h>
void sub_traverse(char * s, int i, int n)
{
    char t;
    int j;
    for(j = i; j < n; j++)
    {
        t = s[i]; s[i] = s[j]; s[j] = t;
        sub_traverse(s, i + 1, n);
    }
    if(i == n) puts(s);
}

void traverse(char * s)
{
    int n, i;
    n = strlen(s);
    sub_traverse(s, 0, n);
    for(i = n - 1; i; n *= i--);
    printf("共 %d 个\n", n);
}

int main()
{
    char a[10];
    int p, i;
    printf("请输入要排列的字符(至少三个):  ");
    gets(a);
    traverse(a);
    return 0;
}

重剑无锋,大巧不工
2012-10-27 22:34
Y影子Z
Rank: 3Rank: 3
来 自:石家庄
等 级:论坛游侠
帖 子:54
专家分:110
注 册:2012-10-12
得分:0 
感谢版主提示,我又重新认识了一下gets()函数,学习到它的不足,今后尽量用fgets()代替。但函数接口这我没感觉出简化来,还是三个参数。
不过,版主的程序sub_traverse函数存在问题,会导致重复字串的输出,我还没有想好怎么改


[ 本帖最后由 Y影子Z 于 2012-10-28 00:25 编辑 ]

有光明必然会有黑暗,而影子,就是光明与黑暗的缝隙
2012-10-28 00:09
Y影子Z
Rank: 3Rank: 3
来 自:石家庄
等 级:论坛游侠
帖 子:54
专家分:110
注 册:2012-10-12
得分:0 
版主,我认为这个函数应该再添一句
void sub_traverse(char * s, int i, int n)
 {
     char t;
     int j;
     for(j = i; j < n; j++)
     {
         t = s[i]; s[i] = s[j]; s[j] = t;
         sub_traverse(s, i + 1, n);
         t = s[i]; s[i] = s[j]; s[j] = t;  //为防止顺序被打乱,每次移动后再移回去,这样就不会有重复输出的情况了
     }
     
     if(i == n) puts(s);
 }

有光明必然会有黑暗,而影子,就是光明与黑暗的缝隙
2012-10-28 00:22
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:5 
我晕,粘代码时怎么会少了一行?

你改的是对的。

重剑无锋,大巧不工
2012-10-29 20:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-384683-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.213066 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved