社区
C++ 语言
帖子详情
计算24点的程序讨论,欢迎大家进来
smq
2007-04-28 10:09:37
http://club.it.sohu.com/read_art_sub.new.php?b=program&a=73842&sr=0&allchildnum=1&t=0&NoCache=1
欢迎大家发表看法,谢谢帮顶,会给分的
...全文
503
15
打赏
收藏
计算24点的程序讨论,欢迎大家进来
http://club.it.sohu.com/read_art_sub.new.php?b=program&a=73842&sr=0&allchildnum=1&t=0&NoCache=1 欢迎大家发表看法,谢谢帮顶,会给分的
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yuyunliuhen
2007-05-01
打赏
举报
回复
好强啊,我也研究一下看看
michaeldg
2007-05-01
打赏
举报
回复
有难度,不容易呀 !
yuanchuang
2007-04-30
打赏
举报
回复
楼上回答经典,呵呵
mathe
2007-04-30
打赏
举报
回复
看我一个php写的代码:http://blog.csdn.net/mathe/archive/2006/08/29/1135691.aspx
oyd
2007-04-29
打赏
举报
回复
我一直想寻求一个史上最牛的算24的程序,可惜一直找不到
所谓最牛,要至少符合下面一点:
1. 奇思妙想,从没人想过用这种方式来计算24
2. 程序效率奇高,可以证明是最快的算24程序
3. 程序简短无比,再也找不到比它还短的算24程序
4. 程序莫名其妙,很难看懂这个程序是什么意思,但是它确实能算出24
iamwiner
2007-04-29
打赏
举报
回复
up
taodm
2007-04-29
打赏
举报
回复
(2)计算过程两种:((1OP2)OP(3OP4))或者(((1OP2)OP3)OP4).
这是不够的。用什么逆波兰序表示法或者完全2叉树生成,应该是5种。
scanlog
2007-04-29
打赏
举报
回复
我自己前段时间也在看这个,方法就是穷举,自己比较喜欢的一种实现方法是这样的:
(1)4个数字排序,24种排法.
(2)计算过程两种:((1OP2)OP(3OP4))或者(((1OP2)OP3)OP4).
(3)任意两个数的可能的6个结果:A+B,A-B,A*B,A/B,B-A,B/A.
个人愚见,仅供参考~
drin82
2007-04-28
打赏
举报
回复
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;
const int N = 10;
int a[4] = {2,5,8,9};
char y[3];
int func(int i, int rslt)
{
int b = 0;
if(i==3)
{
if(rslt==a[3])
{
return 1;
}
else
{
return 0;
}
}
if(rslt%a[i]==0)
{
b=func(i+1, rslt/a[i]);
if(b!=NULL)
{
y[i]='*';
return b;
}
}
b=func(i+1, rslt-a[i]);
if(b)
{
y[i]='+';
return b;
}
b=func(i+1, rslt+a[i]);
if(b)
{
y[i]='-';
return b;
}
b=func(i+1, rslt*a[i]);
if(b)
{
y[i]='/';
return b;
}
return NULL;
}
int main(int argc, char *argv[])
{
func(0, 24);
for(int i=0; i<3; i++)
{
cout<<y[i]<<" ";
}
cout<<endl;
system("PAUSE");
return 0;
}
celftj
2007-04-28
打赏
举报
回复
JF啊JF
jixingzhong
2007-04-28
打赏
举报
回复
自己写的一个古老程序。
分两类情况:
1 (a op b)op(c op d) abcd为四个操作数, op 为四中运算之一
2 ((a op b) op c) op d
使用分类+循环即可,
重复性判断可能比较复杂了点,
仅供参考 ....
jixingzhong
2007-04-28
打赏
举报
回复
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef float (*PF)(float, float);
char *ch[]={NULL,"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
char cc[]="+-*/";
//int rand_seed = 0;
void rand_num(int *num)
{
int i;
// srand(num[(rand_seed++)%4]);
for(i=0; i<4; i++)
num[i] = rand()%12 +1;
}
float add(float x, float y)
{
return x+y;
}
float sub(float x, float y)
{
return x-y;
}
float mul(float x, float y)
{
return x*y;
}
float divide(float x, float y)
{
if((y>-0.0000001)&&(y<0.0000001))
return 0;
else return x/y;
}
/*The compute function!*/
void compute_24(int num[])
{
PF pf[4]={add,sub,mul,divide};
int i,j,k,x,y,z,t;
int flag=0,flag_i=0, flag_j=0, flag_equ_end2=0;
float op_x, op_y, op_z;
/*Kind 1*/
for(i=0; i<4; i++) /*num[i] is the first para*/
{
for(t=0; t<i; t++)
if(num[t] == num[i])
flag_i = 1;
if(flag_i)
{
flag_i=0;
continue;
}
for(j=0; j<4; j++) /*num[j] is the 2nd para*/
{
if(j == i)
continue;
for(t=j-1; t>0; t--)
if((num[j] == num[t])&&(num[i]!=num[t]))
flag_j = 1;
if(flag_j)
{
flag_j=0;
continue;
}
for(x=0; x<4; x++) /*pf[x] is the 1st operation*/
{
if((j<i)&&
((x==0)||(x==2))
)
continue;
op_x = pf[x]((float)num[i],(float)num[j]);
for(k=0; k<4; k++) /*num[k] is the 3rd para, and the last is num[6-i-j-k]*/
{
if(k==i || k==j)
continue;
if(num[k] == num[6-i-j-k])
flag_equ_end2 = 1;
for(y=0; y<4; y++) /*pf[y] is the 2nd operation*/
{
if( (k<j)&&
(((x<2)&&(y<2)) ||
((x>1)&&(y>1)))
)
continue;
op_y = pf[y](op_x, (float)num[k]);
for(z=0; z<4; z++) /*pf[z] is the 3rd operation*/
{
if((x==y)&&(x==z)&&((i!=0)||(j!=1)||(k!=2)))
continue;
if( (((z<2)&&(y<2)) ||
((z>1)&&(y>1))) &&
(k>(6-i-j-k))
)
continue;
op_z = pf[z](op_y, (float)num[6-i-j-k]);
if(((op_z - 24)>-0.0000001) && ((op_z - 24)<0.0000001))
{
flag=1;
printf("((%d %c %d) %c %d) %c %d == 24\n",num[i], cc[x], num[j], cc[y], num[k], cc[z], num[6-i-j-k]);
}
}
}
if(flag_equ_end2)
{
flag_equ_end2 = 0;
break;
}
}
}
}
}
/*Kind 2*/
for(i=0; i<4; i++) /*num[i] is the first para*/
{
for(t=0; t<i; t++)
if(num[t] == num[i])
flag_i = 1;
if(flag_i)
{
flag_i=0;
continue;
}
for(j=0; j<4; j++) /*num[j] is the 2nd para*/
{
if(j == i)
continue;
for(t=j-1; t>-1; t--)
if((num[j] == num[t])&&(num[i]!=num[t]))
flag_j = 1;
if(flag_j)
{
flag_j=0;
continue;
}
for(x=0; x<2; x++) /*pf[x] is the 1st operation*/
{
if((j<i)&&(x==0))
continue;
op_x = pf[x]((float)num[i],(float)num[j]);
for(k=0; k<4; k++) /*num[k] is the 3rd para, and the last is num[6-i-j-k]*/
{
if(k==i || k==j)
continue;
for(y=0; y<2; y++) /*pf[y] is the 2nd operation*/
{
if((y==0)&&(k>(6-i-j-k)))
continue;
op_y = pf[y]((float)num[k],(float)num[6-i-j-k]);
for(z=2; z<4; z++) /*pf[z] is the 3rd operation*/
{
if((z==2) &&
(((k<i)&&(k<j)) ||
(((6-i-j-k)<i)&&((6-i-j-k)<j))
)
)
continue;
op_z = pf[z](op_x, op_y);
if(((op_z - 24)>-0.0000001) && ((op_z - 24)<0.0000001))
{
flag=1;
printf("(%d %c %d) %c (%d %c %d) == 24\n",num[i], cc[x], num[j], cc[z], num[k], cc[y], num[6-i-j-k]);
}
}
}
}
}
}
}
if(!flag)
{
flag = 0;
puts("Sorry, there is no answer!!");
}
}
int main()
{
int num[4],i;
char c='y';
while(c == 'y')
{
rand_num(num);
for(i=0; i<4; i++)
printf("%d--%s\t",num[i],ch[num[i]]);
puts("");
compute_24(num);
printf("\n\nEnter 'y' continue or others break: ");
scanf("%c",&c);
fflush(stdin);
}
}
bargio_susie
2007-04-28
打赏
举报
回复
网上好象很多的,帮顶了
taodm
2007-04-28
打赏
举报
回复
4个数算24不难,难在2处
1:去除所有重复,简单点是只去满足交换律的,复杂点要去除满足运算符翻转的。
2:推广到N个数算X
drin82
2007-04-28
打赏
举报
回复
写错了,不好意思!
C# 写一个
24点
计算
程序
我在和小伙伴玩 24 点这个游戏,但是我的
计算
速度比他慢,于是我就写了一个作弊的
程序
这个游戏的规则是给定 4 个数字,然后你根据加减乘除规则,不重复利用这几个数字
计算
出 24 这个数字 例如给定了 2 6 1 1 这几个数字,可以使用 2 * 6 = 12 然后 1 + 1 = 2 拿到 2 和 12 两个数字,后面的也不需要说了 简单的实现是在不考虑性能下,先对给定的数字进行全排列,然后...
纸牌
24点
,Python
程序
实现
最近刚刚接触python,又恰巧和室友玩纸牌,想到小时候玩的
24点
游戏,所以当做练习,写了一段代码。 参考了一位叫GreatAnt网友的
程序
,但是他实现的只是一种
计算
结果的输出,为了看到所以
计算
可能的输出,我编写了下面一段代码,
欢迎
广大网友来此留言交流。
基于分治法的
24点
游戏
计算
程序
设计与实现
中间结果是指在递归过程中,每一步
计算
所产生的临时结果。例如,在处理四个数字时,第一次
计算
a + b的结果e,那么e就是当前递归层的中间结果。该中间结果将作为下一层递归的输入参数之一。
c语言
24点
扑克游戏,C语言实现
24点
扑克牌游戏(随机出牌,自动
计算
结果)
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,L代表10,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决
24点
游戏。随机生成4个代表扑克牌牌面的数字字母,
程序
自动列出所有可能算出24的表达式,用擅长的语言实现
程序
解决问题。我采用了最熟练的C语言实现了该游戏
程序
,此
程序
采用的是穷举表达式的方法,然后求值。但是,由于括号的存在让
程序
变得更加有难度,而括号也只是...
用c语言算
24点
的
程序
,C语言算
24点
的源
程序
C语言算
24点
#includedouble fun(double a1,double a2,int b){switch(b){case 0:return (a1+a2);case 1:return (a1-a2);case 2:return (a1*a2);case 3:return (a1/a2);}}void main(){int i,j,k,l,n,m,r,flg=1,save[4],num...
C++ 语言
65,213
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章