计算机二十四点游戏,CCF计算机软件能力认证试题练习:201903-2 二十四点

CCF计算机软件能力认证试题练习:201903-2 二十四点

解题思路

表达式中只含有+、-、x、/四种运算,我们可以简单地用栈来计算它的值。过程是这样的,顺序遍历表达式,如果遇到的是数字,压入数字栈,如果遇到的是符号,压入符号栈。注意,由于x、/的优先级较高,所以当遇到乘法和除法时,直接计算结果,并把结果压入数字栈。还由于,减法的结合性是从左向右的,所以我们做一个简单地转换,将所有的减法变为加法。最后数字栈中的数就是结果了。

此外,本道题还可以构造表达式树。

原文:https://blog.csdn.net/wingrez/article/details/88676235

参考代码:

#include#include#includeusing namespace std;

int main(){

int n;

cin >> n;

while(n--){

string exp;

cin >> exp;

stacks1;

stacks2;

for(int i = 0 ; i < exp.length(); i++){

if(exp[i] >= '1' && exp[i] <= '9'){

s1.push(exp[i] - '0');

}else if(exp[i] == '+' || exp[i] == '-'){

s2.push(exp[i]);

}else{

int n1,n2;

switch(exp[i]){

case 'x':

n1 = s1.top();

s1.pop();

n2 = n1 * (exp[++i] - '0');

s1.push(n2);

break;

case '/':

n1 = s1.top();

s1.pop();

n2 = n1 / (exp[++i] - '0');

s1.push(n2);

break;

}

}

}

stacks3;

stacks4;

while(!s1.empty()){

s3.push(s1.top());

s1.pop();

}

while(!s2.empty()){

s4.push(s2.top());

s2.pop();

}

while(!s4.empty()){

char c = s4.top();

//cout << "c:=" << c << " ";

s4.pop();

int temp1 = s3.top();

s3.pop();

int temp2 = s3.top();

//cout << "temp1=" << temp1 << " temp2=" << temp2 << endl;

s3.pop();

switch(c){

case '+':

//cout << "temp1 + temp2 = " << temp1 + temp2 << " " << endl;

s3.push(temp1 + temp2);

break;

case '-':

//cout << "temp1 - temp2 = " << temp1 - temp2 << " " << endl;;

s3.push(temp1 - temp2);

break;

}

//cout << "s1.size = " << s1.size() << endl;

}

int res = s3.top();

//cout<         if( res == 24) cout << "Yes" << endl;

else cout << "No" << endl;

}

//system("pause");

return 0;

}

来源:https://bbs.csdn.net/topics/392583232

上面这种方法提交100分。

下面这种方法我也觉得可以。

#include#include#includeusing namespace std;

int n;

char str[10];

stacknum;

stacksign;

int main(){

scanf("%d",&n);

getchar();

for(int i=0;igets(str);

while(!num.empty()) num.pop();

while(!sign.empty()) sign.pop();

int j=0;

while(jif(str[j]>'0' && str[j]<='9'){

num.push(str[j]-'0');

}

else{

if(str[j]=='+'){

sign.push('+');

}

else if(str[j]=='-'){ //将减法转换成加法

num.push((str[j+1]-'0')*(-1));

sign.push('+');

j++;

}

else if(str[j]=='x'){ //直接计算乘法

int lhs=num.top();

num.pop();

num.push(lhs*(str[j+1]-'0'));

j++;

}

else if(str[j]=='/'){ //直接计算除法

int lhs=num.top();

num.pop();

num.push(lhs/(str[j+1]-'0'));

j++;

}

}

j++;

}

while(!sign.empty()){ //计算剩余的加法

int rhs=num.top();

num.pop();

int lhs=num.top();

num.pop();

sign.pop();

num.push(lhs+rhs);

}

int ans=num.top();

if(ans==24) printf("Yes\n");

else printf("No\n");

}

return 0;

}

但提交的时候说超时了,而且超出空间限制了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值