C++问题:1()1()1=0,圆括号中为+-*/运算符,编程求出所有可能的等式。

提交的代码要求对关键数据和算法做适当的注释。谢谢帮忙... 提交的代码要求对关键数据和算法做适当的注释。
谢谢帮忙
展开
 我来答
帐号已注销
2020-05-19 · TA获得超过77.1万个赞
知道小有建树答主
回答量:4168
采纳率:93%
帮助的人:168万
展开全部

1-1*1=0

1-1/1=0

1*1-1=0

1/1-1=0

循环:

string exps[16];

char ops[]={'+', '-', '*', '/'};

char buffer[10]={0};

for(int i=0; i<4; i++)

for(int j=0; j<4; j++)

exps[i*4+j]= sprintf("1%c1%c1=0",ops[i],ops[j]);

for(int i=0; i<16; i++)

if(Eval(exps[i])==0) cout<<exps[i]<<endl;

扩展资料:

赋值语句的作用是把某个常量或变量或表达式的值赋值给另一个变量。符号为‘=’。这里并不是等于的意思,只是赋值,等于用‘==’表示。

注意:赋值语句左边的变量在程序的其他地方必须要声明。

得已赋值的变量我们称为左值,因为它们出现在赋值语句的左边;产生值的表达式我们称为右值,因为它们出现在赋值语句的右边。常数只能作为右值。

例如:

count=5;

total1=total2=0;

参考资料来源:百度百科-c++运算符

swordlance
2014-04-08 · TA获得超过1008个赞
知道小有建树答主
回答量:535
采纳率:75%
帮助的人:451万
展开全部
//*******************************
//Answer for http://zhidao.baidu.com/question/390747722551445085.html?fr=uc_push&push=keyword&entry=uhome_new&oldq=1
//C++问题:1()1()1=0,圆括号中为+-*/运算符,编程求出所有可能的等式。
//Author: swordlance
//Date: 2014-04-08 (Fxxk M$ for stop supporting WindowsXP)
//*******************************
#include<iostream>
#include<stdlib.h>
#include<string>

using namespace std;

//四种操作符
string ops[] = {"+1", "-1", "*1", "/1"};
//Eval的定义
int Eval(string curExp);

//分解为两个子问题
//1---生成所有1()1()1的表达式,字符串
//2---计算所有表达式的值,把为0的输出。

//生成1()1()1()1....型表达式(递归)
//在最后一层完成求值和输出,求值使用Eval函数
//opCnt为操作符个数:1()1()1的情况就为2
//preExp上层生成的表达式
void GenerateExpression(int opCnt, string preExp)
{
string curExp; //当前exp
if(opCnt>0)
{
//生成下级表达式
for(int i=0; i<4; ++i)
GenerateExpression(opCnt-1, preExp + ops[i]);
}
else //opCnt=0
{
//计算表达式的值,如果为0则输出
if(Eval(preExp) == 0) cout<<preExp<<"=0"<<endl;
}
}

//计算表达式的值,一般来说需要写一个表达式翻译器,但是考虑到题目特殊,可以优化
//1、操作数只有1,所以就不用分析操作数了
//2、运算符只有+-*/所以就不用考虑括号问题,只需要考虑四则运算优先级
//3、考虑*/的操作数,有两个来源,一个是1,一个是其他*/操作数的结果,
//用归纳法可以容易的知道,*/的结果一定是1,所以原则上表达式中*1和/1
//对结果没有任何影响(我爱阿贝尔群!)
//4、由于3、证明了*/对结果没有影响,所以就不用考虑运算优先级问题了,哦也!
int Eval(string curExp)
{
int result = 0;
if(curExp.length()==0 || curExp.length()%2==0) throw new exception("Wrong exception format."); //空表达式,偶数字符表达式都是非法的
if(curExp[0]=='1') result = 1;
else new exception("Wrong exception format."); //表达式不是1()1()1...格式的

for(int i=1; i<(int)curExp.length(); i+=2)
{
string curOp = curExp.substr(i,2);
if(curOp == "+1") result++; //+1
else if(curOp == "-1" ) result--; //-1
//*1和/1对表达式结果没有影响
}

return result;
}

int main()
{
//寻找1()1()1=0的表达式并输出
GenerateExpression(2,"1");

system("PAUSE");
return 0;
}
追问
太夸张了吧  我们才刚学几节课  可以来个简单点的吗
追答

简单的?

1-1*1=0

1-1/1=0

1*1-1=0

1/1-1=0

答案是以上四个,用cout输出到屏幕上?但是这样就没有关键数据和算法了……

你是觉得第一步GenerateExpression()难还是Eval()难?

觉得第一个难的话你可以用循环生成16个表达式然后调用Eval算。

循环大概是这样的


string exps[16];
char ops[]={'+', '-', '*', '/'};
char buffer[10]={0};

for(int i=0; i<4; i++)
    for(int j=0; j<4; j++)
        exps[i*4+j]= sprintf("1%c1%c1=0",ops[i],ops[j]);

for(int i=0; i<16; i++)
    if(Eval(exps[i])==0) cout<<exps[i]<<endl;
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tangyaqian0724
2014-04-08
知道答主
回答量:14
采纳率:0%
帮助的人:4.2万
展开全部
两个循环
首先就是对第一个括号内的运算符号取值,取定后在取第二个括号的值,四个运算符号进行逐一的尝试。有合适的就输出
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友2023e5c0b3
2014-04-08 · 超过20用户采纳过TA的回答
知道答主
回答量:180
采纳率:0%
帮助的人:22.3万
展开全部
1-1/1=0
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式