求C穷举2-6位字符串代码

清风道禅 2010-01-04 05:13:29
求高手给一份高效率穷举小写字母的算法 2-6位的 谢谢
...全文
215 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
BABY 2010-01-05
  • 打赏
  • 举报
回复
该封……
lusure 2010-01-05
  • 打赏
  • 举报
回复
这题有啥意义啊?还能有这么多回帖。汗!~又不是设计cpu。。
ZXW0521 2010-01-05
  • 打赏
  • 举报
回复
做个字母表 tab[length]
比如 0~9,a~z,A~Z,还有其它一些字符,

for (int i = 0; i < length(字母表大小); i++)//第一位
{
str[0] = tab[i];
。。。。。。。。。。。。。。//迭代第 2~6位,

}
mstlq 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 selooloo 的回复:]
来个非递归的版本,只试了2-4位的,文本文档有4M多,感觉再大用文本文档存也没意义了,存了也打不开

[/Quote]
6位有可能超2g……
selooloo 2010-01-05
  • 打赏
  • 举报
回复
来个非递归的版本,只试了2-4位的,文本文档有4M多,感觉再大用文本文档存也没意义了,存了也打不开

#include <stdio.h>
#include <stdlib.h>
#define SIZE 4//一次写入文件的大小
typedef struct{
char word[7];
}Word;
Word *pw;
FILE *fp;
unsigned long total=0;
void Chose(int n,int m)
{
int *num,i,j,m1=0;

num=(int *)calloc(n,sizeof(int));
while(num[0]<m)
{
for(i=0;i<n;i++)
pw[total].word[i]=num[i]+'a';
//printf("%s\n",pw[total].word);
if(total==SIZE)
{
fwrite(pw,sizeof(Word),SIZE,fp);
total=0;
}
for(j=n-1;j>=1;j--)
{
m1=(j<n-1)?(m1+1):(m-2);
if(m1>=m)
m1=m-1;
if(num[j]>m1)
{
num[j-1]++;
num[j]=0;
}
else if(j==n-1)
num[j]++;
}
total++;
}
free(num);
}

int main(void)
{
int i;
pw=(Word *)calloc(SIZE,sizeof(Word));
fp=fopen("d:\\穷举结果.txt","w"); //结果保存在d:\\穷举结果.txt里
for(i=2;i<=6;i++)
Chose(i,26);
if(total<=SIZE)
fwrite(pw,sizeof(Word),SIZE,fp);
free(pw);
fclose(fp);
getchar();
return 0;
}
cattycat 2010-01-05
  • 打赏
  • 举报
回复
这个循环本身不会花多少时间,写到文件中,io性能影响比较大,可以先将部分结果缓存起来,一次写比较大的数据块,频繁fputs效率不好。
lqbk1 2010-01-05
  • 打赏
  • 举报
回复
把从aa到zzzzz输出到txt文档,我的电脑用时2.5秒……
六位的,我电脑没那么大磁盘空间,不试了……
速度估计在2.5*26=47秒左右


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

#define VI(q) data[q]='\n',data[q+1]='\0',visit(data,fp)
#define IR(i) for(data[i]='a';data[i]<='z';++data[i])
#define IFR(i) for(data[i]='a';data[i]<='z' || data[i]=='z'+1 && (VI(i)) ;++data[i])

int visit(const char* data,FILE *fp){fputs(data,fp);return 0;};

int main(void)
{
FILE *fp=fopen("c:\\ret.txt","w");
char *data=calloc(8,1);
/*5位字符做示范*/
IR(0) IR(1) IFR(2) IFR(3) IFR(4) VI(5);
/*下面是6位的版本*/
/*IR(0) IR(1) IFR(2) IFR(3) IFR(4) IFR(5) VI(6);*/
free(data);
fclose(fp);
return 0;
}
mstlq 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 neumik 的回复:]
引用 14 楼 mstlq 的回复:
引用 12 楼 mstlq 的回复:
以下代码在我电脑上耗时
C/C++ code
Process returned0 (0x0)  execution time :1.453 s
Press any key tocontinue.
C/C++ code
#include <stdio.h>
#include <stdlib.h>#define IFR(i) for(data[i]='a';data[i] <='z' || data[i]=='z'+1 && (data[i]='\0',visit(data)) ;++data[i])int visit(constchar* data){return0;};int main(void)
{char*data=calloc(7,1);char i0,i1,i2,i3,i4,i5;
    data[6]='\n';for(data[0]='a';data[0] <='z';++data[0])for(data[1]='a';data[1] <='z';++data[1])
            IFR(2)
                IFR(3)
                    IFR(4)
                        IFR(5)
                        visit(data);

    free(data);return0;
}

禁止编译器优化的话……
运行时间

Process returned 0 (0x0)  execution time :3.375 s
Press any key to continue.


谢谢 14楼 我打算就是先生成再一次写入·分开写入会占据读写时间
[/Quote]

我怕你没那么多内存……
清风道禅 2010-01-05
  • 打赏
  • 举报
回复
再缓一缓看看是否还有更好的出现呵呵·下午5点结贴
清风道禅 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lqbk1 的回复:]
把从aa到zzzzz输出到txt文档,我的电脑用时2.5秒……
六位的,我电脑没那么大磁盘空间,不试了……
速度估计在2.5*26=47秒左右

C/C++ code
#include<stdio.h>
#include<stdlib.h>#define VI(q) data[q]='\n',data[q+1]='\0',visit(data,fp)#define IR(i) for(data[i]='a';data[i]<='z';++data[i])#define IFR(i) for(data[i]='a';data[i]<='z' || data[i]=='z'+1 && (VI(i)) ;++data[i])int visit(constchar* data,FILE*fp){fputs(data,fp);return0;};int main(void)
{
FILE*fp=fopen("c:\\ret.txt","w");char*data=calloc(8,1);/*5位字符做示范*/
IR(0) IR(1) IFR(2) IFR(3) IFR(4) VI(5);/*下面是6位的版本*//*IR(0) IR(1) IFR(2) IFR(3) IFR(4) IFR(5) VI(6);*/
free(data);
fclose(fp);return0;
}
[/Quote]
谢谢15楼的代码,这个数据量确实不小呵呵·
清风道禅 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 mstlq 的回复:]
引用 12 楼 mstlq 的回复:
以下代码在我电脑上耗时
C/C++ code
Process returned0 (0x0)  execution time :1.453 s
Press any key tocontinue.
C/C++ code
#include <stdio.h>
#include <stdlib.h>#define IFR(i) for(data[i]='a';data[i] <='z' || data[i]=='z'+1 && (data[i]='\0',visit(data)) ;++data[i])int visit(constchar* data){return0;};int main(void)
{char*data=calloc(7,1);char i0,i1,i2,i3,i4,i5;
    data[6]='\n';for(data[0]='a';data[0] <='z';++data[0])for(data[1]='a';data[1] <='z';++data[1])
            IFR(2)
                IFR(3)
                    IFR(4)
                        IFR(5)
                        visit(data);

    free(data);return0;
}

禁止编译器优化的话……
运行时间

Process returned 0 (0x0)  execution time :3.375 s
Press any key to continue.

[/Quote]
谢谢 14楼 我打算就是先生成再一次写入·分开写入会占据读写时间
mstlq 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mstlq 的回复:]
以下代码在我电脑上耗时
C/C++ code
Process returned0 (0x0) execution time :1.453 s
Press any key tocontinue.
C/C++ code
#include<stdio.h>
#include<stdlib.h>#define IFR(i) for(data[i]='a';data[i]<='z' || data[i]=='z'+1 && (data[i]='\0',visit(data)) ;++data[i])int visit(constchar* data){return0;};int main(void)
{char*data=calloc(7,1);char i0,i1,i2,i3,i4,i5;
data[6]='\n';for(data[0]='a';data[0]<='z';++data[0])for(data[1]='a';data[1]<='z';++data[1])
IFR(2)
IFR(3)
IFR(4)
IFR(5)
visit(data);

free(data);return0;
}
[/Quote]
禁止编译器优化的话……
运行时间

Process returned 0 (0x0) execution time : 3.375 s
Press any key to continue.
mstlq 2010-01-05
  • 打赏
  • 举报
回复
如果楼主要把字符串打印在屏幕或者输出到文件,那就慢了……
因为26*26*26*26*26*26可不是个小数目,把所有字符组合输出到一个文本文件,大小都超过1.5g了……
以上还忽略了长度低于6的字符
mstlq 2010-01-05
  • 打赏
  • 举报
回复
以下代码在我电脑上耗时

Process returned 0 (0x0) execution time : 1.453 s
Press any key to continue.




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

#define IFR(i) for(data[i]='a';data[i]<='z' || data[i]=='z'+1 && (data[i]='\0',visit(data)) ;++data[i])

int visit(const char* data){return 0;};

int main(void)
{
char *data=calloc(7,1);
char i0,i1,i2,i3,i4,i5;
data[6]= '\n';
for(data[0]='a';data[0]<='z';++data[0])
for(data[1]='a';data[1]<='z';++data[1])
IFR(2)
IFR(3)
IFR(4)
IFR(5)
visit(data);

free(data);

return 0;
}
清风道禅 2010-01-05
  • 打赏
  • 举报
回复
谢谢大家,我确实菜
嗯现在详细描述下:
需求:一次性生成 aa-zzzzzz中所包含的字符串(aa,ab,ac.. aaa,aab,aac..zzzzzz),只要小写的就OK 不要数字(其实就是生成密码字典的那个)
我个人测试了就是太慢了·我用得递归..所以我想找一个好的算法 更高效生成我要得字符串列表.
我与别人的字典生成工具做过比较,真的差距太远了,所以才来求大伙帮忙.
希望高手赐教,最高能给出算法和思路(脑袋不怎么好使,自己弄了1天了,有点思维定势了)
谢谢大家

  • 打赏
  • 举报
回复
不知道你说的效率要求如何,但是考虑用递归的话,是蛮简单的,当然效率没那么好。



void swap(char *str1,char *str2)
{
char temp;
temp=*str1;
*str1=*str2;
*str2=temp;
}

void permStr(char *str,int i)
{
//printf("%d",i);
if(i==strlen(str)-1)
printf("%s\n",str);
else
{
for(int j=i;j<strlen(str);j++)
{
//printf("i %d,j %d",i,j);
swap(&str[i],&str[j]);
permStr(str,i+1);
swap(&str[i],&str[j]);
}
}
}

void main()
{
char str[]={"abcde"};

permStr(str,0);

}

z569362161 2010-01-04
  • 打赏
  • 举报
回复
#include <stdio.h> 
#define N 26
char *lword="abcdefghijklmnopqrstuvwxyz",word[N];
int k=0,M;
unsigned long long total=0;
void Chose(int a1,int a2)
{
int i;
if(0==a2){
for(i=0;i <M;i++)
printf("%c",word[i]);
printf("\n");
total++;
return;}
for(i=a1;i <N;i++)
{
word[k++]=lword[i];
Chose(a1+1,a2-1);
k--;
}
}
int main(void)
{
M=2;
for(M=2;M <=6;M++)
Chose(0,M);
printf("total=%llu\n",total); //穷举数
getchar();
return 0;
}


你可真菜,到现在还没学会
selooloo 2010-01-04
  • 打赏
  • 举报
回复
上面没贴好

#include <stdio.h>
#include <string.h>
#define N 26
char *lword="abcdefghijklmnopqrstuvwxyz",word[N];
int k=0,M;
unsigned long long total=0;
void Chose(int a1,int a2)
{
int i;
if(0==a2){
for(i=0;i<M;i++)
printf("%c",word[i]);
printf("\n");
total++;
return;}
for(i=a1;i<N;i++)
{
word[k++]=lword[i];
Chose(a1+1,a2-1);
k--;
}
}
int main(void)
{
M=2;
for(M=2;M<=6;M++)
Chose(0,M);
printf("total=%llu\n",total); //穷举数
getchar();
return 0;
}
selooloo 2010-01-04
  • 打赏
  • 举报
回复
不知道这个是不是你要的,穷举到6的话,结果非常的大,要计算挺长时间
[code=C/C++]
#include <stdio.h>
#define N 26
char *lword="abcdefghijklmnopqrstuvwxyz",word[N];
int k=0,M;
unsigned long long total=0;
void Chose(int a1,int a2)
{
int i;
if(0==a2){
for(i=0;i<M;i++)
printf("%c",word[i]);
printf("\n");
total++;
return;}
for(i=a1;i<N;i++)
{
word[k++]=lword[i];
Chose(a1+1,a2-1);
k--;
}
}
int main(void)
{
M=2;
for(M=2;M<=6;M++)
Chose(0,M);
printf("total=%llu\n",total); //穷举数
getchar();
return 0;
}code]
烈火蜓蜻 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zym830828 的回复:]
都穷举了还要咋高效。。
[/Quote]

呵呵,深有同感
加载更多回复(5)

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧