c语言高手朋友们 进来帮个忙 请C语言高手进来帮个忙!

作者&投稿:淡肤 (若有异议请与网页底部的电邮联系)
我算了一下,到第二步后,结果只有126*126=15876种组合,是不是我的理解错了?
我的理解是:从0123456789中分出5个数后,另5个数也就定了,所以只有C(10,5)=252个,其中有一半是前后相同的,所以只有126个,两组126个再两两组合,共有126*126=15876.
按照这个思路,我写了一段程序,结果算一遍用不了一秒钟。
段程序很短小,20多行代码,是以函数的形式作的:
int getcomb(unsigned long ppt[]);
该函数返回组合的组数(即15786),调用之前先开辟一个无符号长整数数组ppt[15786],并将之作为参数供函数直接调用,调用完成后,ppt[]里即是根据上面所说的组合数据。
程序经过算法优化,效率相当高,我作了一下测试,在命令行方式下即便是五六年前的老机子也不会超过0.3秒,内存空间低于64k。由于是算法上的优化,不用C,其运算速度也不会慢到哪里去。
因不知这样的理解对不对,所以没有将代码帖出来,如果需要,即刻帖出。

>>先将0123456789 一分为2 一共有252个组合
我觉得不对吧。不考虑重复的情况下,第一位有10个可能的数值(0~9),第二位有9个可能,第三位有8个可能,以此类推,总共有10*9*8....*2*1(即10的阶乘)=3628800个可能值。不知道我的推断是否正确。
如果有3628800个数值的话,每个数值在源代码里算作13个字符(加逗号/换行符),总共47174400字节(47M)。如果每个数值在执行代码中算作8个字节,共29030400字节(29M)。
第二步的排列,没有看懂,能再解释一下吗?

你这个再次组合是什么意思? 怎么那么多重复的? 126*126*126表示什么意思?

跟“湿润的风”分析一样,两组都为126个字符串,完全重新组合也只有126*126=15876种。

下面是我文库里一篇文章中代码改了下,可以达到楼主的要求。如果不显示,一秒不到就运行完了。

 

#include<stdio.h>
#include<string.h>
#define DISPLAYRESULT 1 //控制是否显示结果
void BFS(char s[], int n); //主要功能的实现函数声明:宽度优先遍历
char result[10]="01234"; //保存子集的字符数组
char leftHalf[10]="56789";
int count=0; //子集个数计数器
int lcount=0; //另一半计数器
int level=0; //保存当前路径长度
char sAll[126][6]; //一半长为5的
char sLeft[126][6]; //另一半
char ppt[126*126][11]; //最终结果
int main()
{
int i,j,k;
char str[]="0123456789";
int len =strlen(str);
for ( i=0;i<= len/2;i++)//依次输出'0','1','2','3','4'为根的所有子树的遍历结果
{
BFS(str+i, strlen(str+i));
}
//重新组合
i=0;j=0;k=0;
for (i=0;i<126;i++)
{
for (j=0;j<126;j++)
{
strcpy(ppt[k],sAll[i]); //双重循环进行重新排列组合
strcat(ppt[k]+5,sLeft[j]);
#if DISPLAYRESULT
if(1) printf("%05d#:%s
",k+1,ppt[k]);
#endif
k++;
}
}
printf("共有结果%d种
",k);
return 0;
}
//深度优先遍历算法。递归实现。
void BFS(char s[], int n)
{
if(s==NULL || n<=0 ||strlen(s)==0) return; //参数合法性判断
result[level]=s[0]; //保存当前路径上最后一个点
result[level+1]='\0'; //添加字符串结束符
level++; //路径长度加1
//count++; //计数器加1
if(level==5)
{
if(result[0]=='0') //含'0'的长为5的字符串,存入result中
{
sprintf(sAll[count],"%s",result);
count++; //计数器加1
#if DISPLAYRESULT
printf("%3d(%2d): %s
",count,level,result);//输出当前路径上的字符串
#endif
}
else{ //另外五个字符,存在sLeft中
sprintf(sLeft[lcount],"%s",result);
lcount++; //计数器加1
}
}
for(int i=1;i<n;i++) //对所有子树执行本算法
{
BFS(s+i,n-i);
}
level--; //回退。很重要!以便之后处理上一层其他子树
return ;
}


你最后的数据要什么格式的?二维数组?ppy[i][j],i=0~2000375,j=0-5,表示第i组第j个串?

便我在易语言程序里边直接读取

用VB做行么?

C语言朋友进来帮个忙!~

这个是不是库函数啊,你查一下编译器的使用说明书,如果不是的话,那就要把原函数拿出来给大家瞧瞧.

代码完全正确,在VC++6上!!! 不用改。

c/c++语言中int类型与机器及编译器有关。建议换long

int a,b,c,d,e,f,i;
改成
int a,b,c,d,f,i;
long e;