C++问题:1()1()1=0,圆括号中为+-*/运算符,编程求出所有可能的等式。
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++运算符
//*******************************
//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;
首先就是对第一个括号内的运算符号取值,取定后在取第二个括号的值,四个运算符号进行逐一的尝试。有合适的就输出