求此C++源程序的详细解读!题目是输入4个数用四则运算计算出24!急!

题目:输入任意四个整数(0到10),运算符只有加减乘除,还有括号.每个数只能且必须用一次。要求判断这些表达的结果中是否有24。如果有,输出计算表达式:如输入4,6,1,1... 题目:输入任意四个整数(0到10),运算符只有加减乘除,还有括号.每个数只能且必须用一次。要求判断这些表达的结果中是否有24。如果有,输出计算表达式:如输入4,6,1,1 输出 4*6*1*1 =24 (允许有括号)。

源程序:#include"stdio.h"
#include"iostream"
using namespace std;
int number(int a,int b,int c,int d );
char m[]={'+','-','*','/'};
int main(){
int a,b,c,d,e,i,n;
cout<<"please input 4 numbers(1~9):"<<endl;
cin>>a>>b>>c>>d;

for(i=0;i<4;i++){
if(i==0)
{
if(number(a,b,c,d))
n++;
}
else
{ e=a;a=b;b=c;c=d;d=e;

if(number(a,b,c,d))
n++;
}}
if(!n)
printf("can not get 24!\n");

return 0;

}
class sum{
public:
sum():c('+'){};
double operator() (double x,double y);
char c;
};
double sum::operator() (double x,double y){
switch(c){
case '+':
return x+y;
case '-':
return x-y;
case '*':
return x*y;
case '/':
if(y==0) return 0xFFFFFFFF;
return x/y;
default:
return 0;
}
}sum f,g,h;

int number(int a,int b,int c,int d ){
(double)a;(double)b;(double)c;(double)d;
int t; t=0;
for(int i=0;i<4;i++)
{
f.c=m[i];
for(int j=0;j<4;j++)
{
g.c=m[j];
for(int k=0;k<4;k++)
{
h.c=m[k];
if ((int)h(g(f(a,b),c),d)==24)
{ cout<<"(("<<a<<f.c<<b<<")"<<g.c<<c<<")"<<h.c<<d<<"=24"<<endl;++t;}
if ((int)g(f(a,b),h(c,d))==24)
{ cout<<"("<<a<<f.c<<b<<")"<<g.c<<"("<<c<<h.c<<d<<")=24"<<endl;++t;}
if ((int)h(f(a,g(b,c)),d)==24)
{ cout<<"("<<a<<f.c<<"("<<b<<g.c<<c<<"))"<<h.c<<d<<"=24"<<endl;++t;}
if ((int)f(a,h(g(b,c),d))==24)
{ cout<<a<<f.c<<"(("<<b<<g.c<<c<<")"<<h.c<<d<<")=24"<<endl;++t;}
}
}
} if(t)
return 1;
else
return 0;}
还有就是当输入不能计算出24的数字后,不显示“can not get 24!”
不知道为什么,求大神解答!
展开
 我来答
_whales
2012-12-19 · TA获得超过2278个赞
知道大有可为答主
回答量:1814
采纳率:85%
帮助的人:437万
展开全部
题目:输入任意四个整数(0到10),运算符只有加减乘除,还有括号.每个数只能且必须用一次。要求判断这些表达的结果中是否有24。如果有,输出计算表达式:如输入4,6,1,1 输出 4*6*1*1 =24 (允许有括号)。

源程序:
现在加注释如下:其中 不显示“can not get 24!” 已经更改,试试吧
#include"stdio.h"
#include"iostream"
using namespace std;
int number(int a,int b,int c,int d );
char m[]={'+','-','*','/'};//运算符
int main(){
// int a,b,c,d,e,i,n;//定义变量,n没有初始化,应定义为0改为如下
int a,b,c,d,e,i,n=0;//定义变量,n初始化为0
cout<<"please input 4 numbers(1~9):"<<endl;//输出提示信息。
cin>>a>>b>>c>>d;//输入四个数

for(i=0;i<4;i++){//轮换四次,所有可能的运算都包括在内了。
if(i==0)//第一次
{//不交换数值。
if(number(a,b,c,d))
n++;//成功计数加1
}
else //否则交换数值
{ e=a;a=b;b=c;c=d;d=e;

if(number(a,b,c,d))
n++;
}}
if(!n)//没有一次成功
printf("can not get 24!\n");//显示不能构成24点

return 0;

}
//运算子类

class sum{
public:
sum():c('+'){};
double operator() (double x,double y);函数运算符 operator()
char c;//运算符
};
////////////////////////////////////////////////
//计算函数的实现
// C++的函数运算符 operator()可以带任意多个参数,这里带两个参数。
double sum::operator() (double x,double y){
switch(c){ 根据 运算符c ,来实现加减乘除等,不同的运算
case '+':
return x+y;
case '-':
return x-y;
case '*':
return x*y;
case '/':
if(y==0) return 0xFFFFFFFF;
return x/y;
default:
return 0;
}
}sum f,g,h;//定义三个算子,四个数用完,只要计算三次。
int number(int a,int b,int c,int d ){
(double)a;(double)b;(double)c;(double)d;
int t; t=0;
for(int i=0;i<4;i++)
{
f.c=m[i]; //算子f遍历+-*/:

for(int j=0;j<4;j++)
{
g.c=m[j];//算子f遍历+-*/:

for(int k=0;k<4;k++)
{
h.c=m[k];//算子f遍历+-*/:

if ((int)h(g(f(a,b),c),d)==24) // ((a,b),c),d计算顺序,成功t加1
{ cout<<"(("<<a<<f.c<<b<<")"<<g.c<<c<<")"<<h.c<<d<<"=24"<<endl;++t;}
if ((int)g(f(a,b),h(c,d))==24) // ((a,b) (c,d))计算顺序,成功t加1
{ cout<<"("<<a<<f.c<<b<<")"<<g.c<<"("<<c<<h.c<<d<<")=24"<<endl;++t;}
if ((int)h(f(a,g(b,c)),d)==24) // ((a,(b,c)),d 计算顺序,成功t加1
{ cout<<"("<<a<<f.c<<"("<<b<<g.c<<c<<"))"<<h.c<<d<<"=24"<<endl;++t;}
if ((int)f(a,h(g(b,c),d))==24) // a,((b,c),d)计算顺序,成功t加1
{ cout<<a<<f.c<<"(("<<b<<g.c<<c<<")"<<h.c<<d<<")=24"<<endl;++t;}
}
}
} if(t)
return 1;//t!=0即t>0 至少成功一次
else
return 0;;//t==0即一次也没有成功。
}
因为n没有初始化为0
所以不能计算出24的数字后,不显示“can not get 24!”
水晶扇
2012-12-18 · TA获得超过1536个赞
知道大有可为答主
回答量:837
采纳率:100%
帮助的人:1053万
展开全部
int main()
{
int a,b,c,d,e,i,n; // n没有初始化,n=0
cout<<"please input 4 numbers(1~9):"<<endl;
cin>>a>>b>>c>>d;
for(i=0;i<4;i++)
{
if(i==0)
{
if(number(a,b,c,d))
n++;
}
else
{
e=a;a=b;b=c;c=d;d=e;
if(number(a,b,c,d))
n++;
}

}
if(!n)
printf("can not get 24!\n");
return 0;
}

定位方法:
int number(int a,int b,int c,int d )
{
(double)a;(double)b;(double)c;(double)d;
int t;
t=0;
for(int i=0;i<4;i++)
{
f.c=m[i];
for(int j=0;j<4;j++)
{
g.c=m[j];
for(int k=0;k<4;k++)
{
h.c=m[k];
if ((int)h(g(f(a,b),c),d)==24)
{
cout<<"(("<<a<<f.c<<b<<")"<<g.c<<c<<")"<<h.c<<d<<"=24"<<endl;
++t;
}
if ((int)g(f(a,b),h(c,d))==24)
{
cout<<"("<<a<<f.c<<b<<")"<<g.c<<"("<<c<<h.c<<d<<")=24"<<endl;
++t;
}
if ((int)h(f(a,g(b,c)),d)==24)
{
cout<<"("<<a<<f.c<<"("<<b<<g.c<<c<<"))"<<h.c<<d<<"=24"<<endl;
++t;
}
if ((int)f(a,h(g(b,c),d))==24)
{
cout<<a<<f.c<<"(("<<b<<g.c<<c<<")"<<h.c<<d<<")=24"<<endl;
++t;
}
}
}
}
printf("t=%d\n",t); // 在这里加一句,你会发现其实对于没有输出的情况,t都正确返回0.那么错误肯定在main()函数中。检查一下就发现了。
if(t) return 1;
else return 0;
}

PS:仿函数用的不错啊。
来自:求助得到的回答
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式