24点程序主要算法思想是穷举、递归。
其实,24点程序中有一些可用以减少运算次数的小技巧。例如:
相比一般的函数,由于加法和乘法满足交换律,所以参与运算的两个数不必交换位置;
如果输入的数都非负(即是正数或0),则运算的中间过程也不必产生负数,所以做减法运算时,不必考虑被减数小于减数的情况。
C语言(编译器是GCC 8)的代码如下:
#include<stdio.h>
// 要计算的原始数组
#define begin 156,353,485,421,979,383,315,602
// 计算的目标
#define end 24
// 原始数组的长度
#define size sizeof(arr)/sizeof(arr[0])
// 组装b完成,递归。如果找到就记录下来
#define f(o); *b=x o y;if(test(n-1,b)){equation e={x,y,*b,#o[0]};es[c]=e;return 1;}
// 将a下标为[i,j)的一段放入b中
#define g(i, j); for(int k=i;k<j;k++)b[l++]=a[k];
typedef struct {
double left, right, result;//左数,右数,运算结果
char operator;//运算符
} equation;//等式
double arr[] = {
begin}