ccf20190302-二十四点
Posted lyeeer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ccf20190302-二十四点相关的知识,希望对你有一定的参考价值。
开始看到题目的时候,只是想着用一个字符串将数字和符号都存起来,因为每一个数字和符号都只是占一个位,所以想之后可以再按照计算的优先顺序判断字串里的每个符号从左到右依次匹配的情况,再进行计算。应该是个可行但是有点傻的方法。
然后百度了一下看有什么较优的解法,果不其然人家总是更厉害。(https://www.cnblogs.com/xidian-mao/p/10588813.html)
引入栈来解题,这样应该能比字符串更好管理。
解法如下:
#include<iostream> #include<string> #include<stack> using namespace std; int calculate(string str) stack<int> s; int flag=1; for(int i=0;i<str.size();i++) //把数字直接存入栈里,减号当成负数存入栈里 if(str[i]>=‘0‘ && str[i]<=‘9‘) s.push(flag*(str[i]-‘0‘)); else if(str[i]==‘-‘ || str[i]==‘+‘) if(str[i]==‘-‘) flag=-1; else flag=1; //1*1+9-9 //栈里:(栈底)1(遇到乘号,出栈) 1(1*1的结果) 9 -9 (栈顶) //乘除计算后,存入栈里 else //*** int x1 = s.top(); s.pop(); i++; int x2 = str[i]-‘0‘; if(str[i-1]==‘/‘) s.push(x1/x2); else s.push(x1*x2); int sum = 0; while(!s.empty()) sum+=s.top(); s.pop(); return sum; int main() int N; scanf("%d",&N); for(int i=0;i<N;i++) string str; cin >> str; if(calculate(str)==24) cout << "Yes" << endl; else cout << "No" << endl; return 0;
这里顺便再复习一下栈的用法。
使用栈时,需要引用#include<stack> 头文件,定义用stack<int> s;
栈使用的是“先进后出”原则,pop()/push()/top()等操作全都是对栈顶做的,还有size()表示栈中的元素个数,empty()表示栈是否为空。
开始在写的时候注释***处,写成了没有i++,然后括号里关于i的操作都+1,在本轮里这样是没有问题的,但是如果遇到乘除号,后面的数字位也是应该已经被取出来计算了,所以需要先加一次,然后再for循环里再加一次,跳过后面的这个数字位。否则会有重复计算
还有一条是while()/if()/for()等如果不加大括号就只会处理第一句,tab换位是没有实际代码意义的。所以还是建议每个都打上,不管一行或多行。(因为我刚就while那里没打,死活不出结果)。。。
以上是关于ccf20190302-二十四点的主要内容,如果未能解决你的问题,请参考以下文章