QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 579|回复: 0

再谈算24。

[复制链接]
发表于 2003-9-16 10:10:51 | 显示全部楼层 |阅读模式
在公社里看见了一片关于算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.没有复点溢出处理。
希望见过更好算法的朋友讲一下你的算法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-14 23:58 , Processed in 0.033651 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表