请求赐教二十四点的算法

tigerzhangyang 2002-04-25 03:40:18
有谁可以给我一个算法:二十四点的算法.
设四个变量a,b,c,d 可以用 + - * / 和()五种运算符
任意输入四个变量,输出一个等式使其结果等于24
有那位可以给我c的代码
谢谢!
================================================================

CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!

★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。

★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。

Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]

...全文
54 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangrk 2002-04-25
  • 打赏
  • 举报
回复
搜索一下主题='24'的,很多的。我也有一个。
fangrk 2002-04-25
  • 打赏
  • 举报
回复
搜索一下主题='24'的,很多的。我也有一个。
kingzeus 2002-04-25
  • 打赏
  • 举报
回复
http://members.lycos.co.uk/huidu/club/club.php?bbsid=529fcbdc142304ab
贴了新的算法,对于<=7个数,穷举所有的可能表达式只需几秒钟。
我试过,在我的计算机上,对于9个数(在无法找到表达式的情况下,也就是要枚举所有的表达式),需要大概两个小时;
kingzeus 2002-04-25
  • 打赏
  • 举报
回复
我也给一个,是使用逆波兰表达式的:

// dot24.cpp - microblue (C) Thu 2002.04.04
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void errexit(const char * msg);
void work(const double v[], const char * s);
int comput(double &result, const double v[], const char * s);
void outline(const double v[], const char * s);

void main(int argc, char * argv [])
{
if (argc != 6) {
fprintf(stderr, "Usage: dot24 number1 number2 number3 number4 result\n");
exit(1);
}
double v[5];
for (int i = 0; i < 5; i++) v[i] = atof(argv[i + 1]);
printf("[%g %g %g %g] [%g]\n", v[0], v[1], v[2], v[3], v[4]);
const char * p = "+-*/";
int a, b, c, d, x, y, z;
for (a = 0; a < 4; a++) {
for (b = 0; b < 4; b++) {
if (b == a) continue;
for (c = 0; c < 4; c++) {
if (c == b || c == a) continue;
for (d = 0; d < 4; d++) {
if (d == c || d == b || d == a) continue;
for (x = 0; x < 4; x++)
for (y = 0; y < 4; y++)
for (z = 0; z < 4; z++) {
char f[64];
sprintf(f,"%d%d%d%d%c%c%c",a,b,c,d,p[x],p[y],p[z]);work(v,f);
sprintf(f,"%d%d%d%c%d%c%c",a,b,c,p[x],d,p[y],p[z]);work(v,f);
sprintf(f,"%d%d%d%c%c%d%c",a,b,c,p[x],p[y],d,p[z]);work(v,f);
sprintf(f,"%d%d%c%d%d%c%c",a,b,p[x],c,d,p[y],p[z]);work(v,f);
sprintf(f,"%d%d%c%d%c%d%c",a,b,p[x],c,p[y],d,p[z]);work(v,f);
}
}
}
}
}
exit(0);
}

void errexit(const char * msg)
{
fprintf(stderr, "error: %s\n", msg);
exit(1);
}

void work(const double v[], const char * s)
{
double result;
if (comput(result, v, s) != 0) return;
const double gap = 0.001;
double diff = result - v[4];
if (diff > gap || diff < -gap) return;
outline(v, s);
return;
}

// return 0 for suceess
int comput(double &result, const double v[], const char * s)
{
if (strlen(s) != 7) errexit("invalid formula length");
double sv[64];
int sp = 0;
for (int i = 0; i < 7; i++) {
switch (s[i]) {
case '0': case '1': case '2': case '3':
sv[sp++] = v[s[i] - '0'];
break;
case '+': case '-': case '*': case '/':
if (sp < 2) errexit("in comput stack empty");
if (s[i] == '/' && sv[sp-1] == 0.0) return 1;
switch (s[i]) {
case '+': sv[sp-2] += sv[sp-1]; break;
case '-': sv[sp-2] -= sv[sp-1]; break;
case '*': sv[sp-2] *= sv[sp-1]; break;
case '/': sv[sp-2] /= sv[sp-1]; break;
}
sp--;
break;
default:
errexit("invalid formula char");
break;
}
}
if (sp != 1) errexit("finish comput stack not empty");
result = sv[0];
return 0;
}

void outline(const double v[], const char * s)
{
if (strlen(s) != 7) errexit("invalid formula length");
static cnt = 0;
printf("%4d> %g = ", ++cnt, v[4]);
int i;
for (i = 0; i < 7; i++) {
switch (s[i]) {
case '0': case '1': case '2': case '3': printf("%g ", v[s[i] - '0']); break;
default: printf("%c", s[i]); break;
}
}
printf(" = ");
char pp[5][128];
int sp = 0;
for (i = 0; i < 7; i++) {
switch (s[i]) {
case '0': case '1': case '2': case '3':
if (sp >= 4) errexit("stack full");
sprintf(pp[sp++], "%g", v[s[i] - '0']);
break;
default:
if (sp < 2) errexit("in comput stack empty");
sprintf(pp[4], "(%s %c %s)", pp[sp-2], s[i], pp[sp-1]);
strcpy(pp[sp-2], pp[4]);
sp--;
break;
}
}
if (sp != 1) errexit("finish comput stack not empty");
int n = strlen(pp[0]);
pp[0][n - 1] = '\0';
printf("%s\n", pp[0] + 1);
}

运行结果如下:
C> dot24 5 1 5 5 24
[5 1 5 5] [24]
1> 24 = 5 1 5 /-5 * = (5 - (1 / 5)) * 5
2> 24 = 5 1 5 /-5 * = (5 - (1 / 5)) * 5
3> 24 = 5 5 1 5 /-* = 5 * (5 - (1 / 5))
4> 24 = 5 5 1 5 /-* = 5 * (5 - (1 / 5))
5> 24 = 5 5 1 5 /-* = 5 * (5 - (1 / 5))
6> 24 = 5 1 5 /-5 * = (5 - (1 / 5)) * 5
7> 24 = 5 1 5 /-5 * = (5 - (1 / 5)) * 5
8> 24 = 5 5 1 5 /-* = 5 * (5 - (1 / 5))
9> 24 = 5 5 1 5 /-* = 5 * (5 - (1 / 5))
10> 24 = 5 1 5 /-5 * = (5 - (1 / 5)) * 5
11> 24 = 5 1 5 /-5 * = (5 - (1 / 5)) * 5
12> 24 = 5 5 1 5 /-* = 5 * (5 - (1 / 5))
C> dot24 6 7 8 9 24
[6 7 8 9] [24]
1> 24 = 6 8 9 7 -/* = 6 * (8 / (9 - 7))
2> 24 = 6 8 *9 7 -/ = (6 * 8) / (9 - 7)
3> 24 = 6 9 7 -/8 * = (6 / (9 - 7)) * 8
4> 24 = 6 9 7 -8 // = 6 / ((9 - 7) / 8)
5> 24 = 8 6 9 7 -/* = 8 * (6 / (9 - 7))
6> 24 = 8 6 *9 7 -/ = (8 * 6) / (9 - 7)
7> 24 = 8 9 7 -/6 * = (8 / (9 - 7)) * 6
8> 24 = 8 9 7 -6 // = 8 / ((9 - 7) / 6)
C>

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧