|
在公社里看见了一片关于算24点帖子,让我想起在《电脑报》上看到的用递归来穷助的算法(不敢独想,意求更好的算法)。我用C实行的代码如下:(进行了一点扩张)
#include <stdio.h>
float js(float *data, int fh)//用如俩数的“+”,“-”,“×”,“/”。
{
switch(fh){
case 0: return (data[0] + data[1]);
case 1: return (data[0] - data[1]);
case 2: return (data[0] * data[1]);
case 3: if(((data[1] <= 0.000001)
&&(data[1] >= -0.000001)))return 0;return (data[0] / data[1]);
default: return 0;
}
}
int d_24(float data[], int n)
{
float data1[n-1],data2[2];//用于缓层数
int p;
if(n == 2){//判断是否只余两数
for(int n1 = 0; n1 < 4; n1++){
float n6 = js(data, n1);
if(((n6 >= 23.5)&&(n6 < 24.5))){//判断是否得到24
switch(n1){
case 0: printf("%f + %f = %f\n", data[0], data[1],(data[0]+data[1]));break;
case 1: printf("%f - %f = %f\n", data[0], data[1],(data[0]-data[1]));break;
case 2: printf("%f * %f = %f\n", data[0], data[1],(data[0]*data[1]));break;
case 3: printf("%f / %f = %f\n", data[0], data[1],(data[0]/data[1]));break;
}
return 0;//结束递归(有结果)
}
}
return 1;//结束递归(没有结果)
}
for(int n2 = 0; n2 < n; n2++){
data2[0] = data[n2];//提取第一个数。
for(int n3 = 0; n3 < n; n3++){
if(n3 != n2){
data2[1] = data[n3];//提取第2个数。
p = 1;
for(int n4 = 0; n4 < n; n4++){
if((n4 !=n2)&&(n4 !=n3)){
data1[p] = data[n4];//将余下的数存入data1,从data[1]开始。
p++;
}
}
for(int n5 = 0; n5 < 4; n5++){
data1[0] = js(data2,n5);
if(!d_24(data1, n-1)){//开始递归。
switch(n5){
case 0: printf("%f + %f = %f\n", data2[0], data2[1],(data2[0]+data2[1]));break;
case 1: printf("%f - %f = %f\n", data2[0], data2[1],(data2[0]-data2[1]));break;
case 2: printf("%f * %f = %f\n", data2[0], data2[1],(data2[0]*data2[1]));break;
case 3: printf("%f / %f = %f\n", data2[0], data2[1],(data2[0]/data2[1]));break;
}
return 0;//结束递归(有结果)
}
}
}
}
}
return 1;//结束函数(没有结果)
}
int main(void)
{
int n=4;//决定计算几个数。
float s[n];
for(int n1=0; n1 < n ; n1++){
scanf("%f", &s[n1]);
}
d_24(s, n);
return 0;
}
请注意:1.此算法效利底下(我计算10个数:5 5 5 1 0 0 0 0 0 0 。吃完早饭还没算完)
2.没有复点溢出处理。
希望见过更好算法的朋友讲一下你的算法。 |
|