关于C++ 计算24点的问题。 以下是源代码,可小弟有很多地方不懂,求大侠赐教。自己的理解,最好加上注释。

#include<iostream>usingnamespacestd;doublecount(doublex,intop,doubley)//2个数四则运算{switc... #include<iostream>
using namespace std;

double count(double x,int op,double y) //2个数四则运算
{
switch(op)
{
case 0: return x+y;
case 1: return x-y;
case 2: return x*y;
case 3: return x/y;
default: puts("Unknown fault"); exit(-1);
}
}

typedef struct AnswerSheet //4个数可能的运算方法排列
{
void calculate(int a,char aop,int b,char bop,int c,char cop,int d)
{
ans[0]=count(count(count(a,aop,b),bop,c),cop,d); // ((a b) c) d
ans[1]=count(count(a,aop,b),bop,count(c,cop,d)); // ((a b) (c d))
ans[2]=count(count(a,aop,count(b,bop,c)),cop,d); // (a (b c)) d
ans[3]=count(a,aop,count(count(b,bop,c),cop,d)); // a ((b c) d)
ans[4]=count(a,aop,count(b,bop,count(c,cop,d))); // a (b (c d))
}
double ans[5];
}AnswerSheet;

void trans_op(char &op) //4种运算符
{
switch(op)
{
case 0: op='+';break;
case 1: op='-';break;
case 2: op='*';break;
case 3: op='/';break;
default:puts("Unknown fault");exit(-1);
}
}

void swap(int* a,int* b) //交换2个指针指向函数
{
int x=*a;
*a=*b;
*b=x;
}
void sort(int *f,int *l)
{
for(int *c=f;c!=l;c++)
for(int *d=c;d!=f&&*d<*(d-1);d--)
if(*d<*(d-1))
swap(d,d-1);
}

bool arrange(int *c)
{
for(int i=1;i!=4;++i)
{
if(c[i-1]<c[i])
{
for(int j=0;j!=i+1;++j)
if(c[i]>c[j])
{
swap(c+i,c+j);
sort(c,c+i);
return true;
}
}
}
return false;
}

int main()
{
bool exist=false;
int num[4];
char op=0,fir=0,sec=0,thi=0;
AnswerSheet answer;
cout<<"请输入4个数:"<<endl;
cin>>num[0]>>num[1]>>num[2]>>num[3];
sort(num,num+4);
do
for(op=0;op!=64;++op)
{
fir=(op & 48)>>4;
sec=(op & 12)>>2;
thi=op & 3;
answer.calculate(num[0],fir,num[1],sec,num[2],thi,num[3]);
trans_op(fir);trans_op(sec);trans_op(thi);
if(answer.ans[0]==24)
cout<<"(("<<num[0]<<fir<<num[1]<<')'<<sec<<num[2]<<')'<<thi<<num[3]<<"=24"<<endl;
exist=true;

if(answer.ans[1]==24)
cout<<'('<<num[0]<<fir<<num[1]<<')'<<sec<<'('<<num[2]<<thi<<num[3]<<")=24"<<endl;
exist=true;

if(answer.ans[2]==24)
cout<<'('<<num[0]<<fir<<'('<<num[1]<<sec<<num[2]<<"))"<<thi<<num[3]<<"=24"<<endl;
exist=true;

if(answer.ans[3]==24)
cout<<num[0]<<fir<<"(("<<num[1]<<sec<<num[2]<<')'<<thi<<num[3]<<")=24"<<endl;
exist=true;

if(answer.ans[4]==24)
cout<<num[0]<<fir<<'('<<num[1]<<sec<<'('<<num[2]<<thi<<num[3]<<"))=24"<<endl;
exist=true;
}
while(arrange(num));
if(!exist) puts("No such combination!");
system("PAUSE");
return 0;
}

sort和arrange两个函数完全搞不懂什么意思。
fir=(op & 48)>>4;
sec=(op & 12)>>2;
thi=op & 3;
这几句话也完全搞不懂。希望绝世高人帮小弟一把,小弟感激不尽。
展开
 我来答
zhykzhykzhyk
2011-11-20 · TA获得超过395个赞
知道答主
回答量:140
采纳率:100%
帮助的人:218万
展开全部
sort是冒泡排序。arrage是取下一个可能序列。fir、sec、thi分别等于(op >> 4) & 3、(op >> 2) & 3、op & 3,其实就是把两个操作数和运算一起压倒一个int中,由于24点一共有4个数,一共有4种运算,所以两个数与运算类型各用2位来表示。
但我觉得这种做法不好,这种问题最好使用前缀或后缀表达式来做。
追问
大仙,谢谢啊。您说的很对。但是我对C++学得是烂之又烂,能否请大侠指导怎样具体用前缀表达式来做。如果方便的话,留下联系方式,小弟万分感激。
追答
枚举所有可能的前缀表达式,由于前缀表达式不需要括号,所以不需要分情况讨论。
http://blog.csdn.net/glldc/article/details/1818787
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式