动态库和静态库的共同点是用函数调用方式使用第三方代码,不同点在于代码编译成可执行的exe文件之后,静态库的内容会原样拷贝到exe文件里和自己写的函数融为一体,因此复制这个exe文件可以拿到其他机器上单独执行,而使用了动态库则只在exe文件头部有一个加载动态库文件接口,exe文件每次执行时都会动态加载动态库文件到内存才能正常运行,如果要拷贝到其他电脑上,则必须也要附带拷贝动态库文件,exe不能单独执行。
动态库比较灵活,有共享特性(多个exe同时使用一个时只需加载一次),加载执行速度较慢;静态库独立性强,相对好使用管理(你只要拷贝一个exe就可以拿到其它机器上了),加载执行速度快。
一楼代码geteval函数需要做写调整,那个使用运算符优先级相同就免除括号算法的有部分错误,当存在除法是“a/b*c*d”和“a/(b*c)*d”显然不一样,因此优先级相同的不能一概而论,修改后的代码如下,可显著减少算式冗余:
int geteval(int *a,int k,int o)
{
char op[]="+-*/",kz[5]={0},kf[5]={0},ev[100];
int i,b[3]={0};
for(i=0;i<3;i++,o/=4)b[i]=o%4; //分解运算符组合(分解为3个4进制数组合)
//实际上括号只和乘除配对,可以在精简算式,太啰嗦就不再考虑怎么组织逻辑了
if(k)
{//处理括号组合,0:无括号,6:两对括号,1-5:通过运算一对括号包含2个或3个操作数
if((b[0]<2&&b[1]<2&&b[2]<2)||(b[0]==2&&b[1]==2))return 0; //运算只有加减或连续两个乘法的不需要括号
if(k<6)
{//一对括号
kz[(k-1)/2]='(';
kf[(k+2)/2]=')';
}
else
{//两对括号
kz[0]=kz[2]='(';
kf[1]=kf[3]=')';
}
}
//用sprintf组合算式
sprintf(ev,"%s%d%c%s%d%s%c%s%d%s%c%d%s",kz,a[0],op[b[0]],kz+1,a[1],kf+1,op[b[1]],kz+2,a[2],kf+2,op[b[2]],a[3],kf+3);
if(eval(ev)==24)
{
printf("%s=24\n",ev);
return 1;
}
return 0;
}
感谢版主提供的几个全排列代码,看来都差不多,看来是不是要考虑一个非递归的全排列了。
我更需要一个能顺序返回全排列结果的函数,就是第一次调用返回1234,第二次调用返回1243……一直到返回0就是全排列完成。