二十四点计算程序

本文分享了一个24点游戏的算法实现,使用TurboC++3.0编写。通过复杂的宏定义和函数指针,该算法能够找到四个1到10之间的整数通过加、减、乘、除运算得到24的所有可能组合。尽管代码风格过时且难以理解,但其核心算法仍具有一定的参考价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这段程序是很久以前写的了,用的是Turbo C++ 3.0,现在看这段程序头皮都麻。我觉得这段代码几乎可以作反面教材了,难以理解的宏,函数指针!GoTo语句,毫无意义的命名,多达七层的循环!现在我看到 Void* 和 Inti(*) 这些东西都有点佩服自己,这些都是什么玩意啊!看的时候,有的注释我想了好长时间才知道啥意思。不过它真的可以给出结果!我特意从网上下载了Trubo C++ 3.0重新编译了这段代码,能正确运行,只是中文显示乱码,于是把中文改为英文,生成了exe文件: 24.exe ,不过每计算一次就要重新执行一次程序啊!
Code
Code
/**//*
 * 24.cpp Author-ZhiQiao
 * 24 点游戏
 * 四个 1 到 10 之间的整数, 每个数都必须使用且只能用一次.
 * 加,减,乘,除可以随意使用,设法使运算结果为24.
 
*/

#include
<iostream.h>
#include
<conio.h>

#define N 4
//LOOP 宏的定义为了书写方便
#define LOOP(i) for(i=0; i<N; i++)
//此函数将void型指针转换为四个操作符对应的函数指针.
#define F(i) ( (int(*)(int,int))opt[i] )
#define FI F(i)
#define FJ F(j)
#define FK F(k)

//定义+,-,x,/四个操作对应的函数
int  add(int a, int b) return a + b; }
int  sub(int a, int b) return a - b; }
int  mul(int a, int b) return a * b; }
int  div(int a, int b) 
//如果a不能被b整除或b为0就返回一个比较大的整数
 if(b==0 || a%b) return 2401;
 
return a/b;
}


   // 根据相应函数在数组中的下标判断其运算符号,用来输出结果
char whichOpt(int index)
{
 
if(index==0)    return '+';
 
else if(index==1return '-';
 
else if(index==2return '*';
       
return '/';
}


// 求解24点的算法实现
void howObtain24(int num[], void* opt[])
{
 
int i,j,k,a,b,c,d;

 LOOP(i) LOOP(j) LOOP(k)                 
//选择运算符
 LOOP(a) LOOP(b) LOOP(c) LOOP(d)  //数字不同的排列顺序
 {
  
if(a==b||a==c||a==d||b==c||b==d||c==d)
     
continue
  
if( FI(FJ(FK(num[a], num[b]), num[c]), num[d]) == 24){
   cout 
<< "((" << num[a] << whichOpt(k) << num[b] << ')'
           
<< whichOpt(j) << num[c] << ')'
           
<< whichOpt(i) << num[d] << endl;
   
goto END;
  }

  
if( FI(FJ(num[a], num[b]), FK(num[c], num[d])) == 24 ){
   cout 
<< '(' << num[a]  << whichOpt(j) << num[b] << ')'
           
<< whichOpt(i) <<
     
'(' << num[c]  << whichOpt(k) << num[d] << ')' << endl;
   
goto END;
  }

 }

 cout 
<< "这几个数字无法得到 24\n"return;
 END: 
return;
}


//=======================================================================
int main()
{
 
//四个数字
 int  num[N]; 
 
//四个运算符对应的函数指针
 void*  opt[N] = { (void*)add, (void*)sub, (void*)mul, (void*)div };
 
 cout 
<< "请输入四个 1 到 10 之间的整数 :\n";
 
for(int i=0; i<N; i++) cin >> num[i];  
 
 
for(int j=0; j<N; j++)
  
if(num[j]<1 || num[j]>10){   
   cout 
<< "输入不符合要求!\n";
   getch();
   
return 0;
  }

 howObtain24(num,opt);
 getch();  
 
return 0;
}

转载于:https://www.cnblogs.com/JoeDZ/archive/2008/01/11/1035343.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值