计算(calc.cpp)x 这题我搞了2晚上qwq

终于会了!可喜可贺!可喜可贺!

计算(calc.cpp)

【问题描述】

小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法)

【输入】

输入文件calc.in共1行,为一个算式。

【输出】

输出文件calc.out共1行,就是密码。

【输入样例】calc.in

1+(3+2)*(7^2+6*9)/(2)

【输出样例】calc.out

258

【限制】

100%的数据满足:算式长度<=30 其中所有数据在231-1的范围内。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int number[101],i=0, p=1;
char symbol[101],s[256],t[256];
void push() { //算符入栈运算
symbol[++p]=s[i];
}
void pop() { //运算符栈顶元素出栈,并取出操作数栈元素完成相应的运算
switch (symbol[p--]) { //运算完成之后扔掉运算符,也标志着需要运算的数已经运算完成
case ‘+‘: {
number[p]+=number[p + 1];
break;
}
case ‘-‘: {
number[p]-=number[p + 1];
break;
}
case ‘*‘: {
number[p]*=number[p + 1];
break;
}
case ‘/‘: {
number[p]/=number[p + 1];
break;
}
case ‘^‘: {
number[p]=pow(number[p],number[p + 1]);
}
}
}
bool can() { //判断运算符的优先级别,建立标志函数,能否进行运算
if ((s[i]==‘+‘||s[i]==‘-‘)&&symbol[p]!=‘(‘)//如果不是‘(’,则需要出栈,因为+与-的运算优先级别较低,仅仅比‘(’大
return 1;
if ((s[i]==‘*‘||s[i]==‘/‘)&&(symbol[p]==‘*‘||symbol[p]==‘/‘))
//若遇到乘除且运算符数组中对应的恰好是乘除,则需要出栈
return 1;
return 0;
}
bool judge(char s[256]) {
int top=0,i=0;
while (s[i]!=‘@‘) {
if (s[i]==‘(‘)top++;
if (s[i]==‘)‘) {
if (top>0) top--;
else return 0;
}
i++;
}
if (top!=0) return 0; //检测栈是否为空。不空则说明有未匹配的括号
else return 1;
}
int main() {
gets(s);
if(judge(s)==0) {
cout<<"NO";
return 0;
}

s[strlen(s)]=‘)‘;
symbol[p]=‘(‘;
while (i<strlen(s)) {
while (s[i]==‘(‘) { //左括号处理,压入左括号,有了左括号才能进行与右括号的匹配 while (symbol[p]!=‘(‘)
push();
i++;
}
int x=0;
while (s[i]>=‘0‘&&s[i]<=‘9‘) //取数入操作数栈
x=x*10+s[i++]-‘0‘;
number[p]=x;
do {
if (s[i]==‘)‘) { //当右括号后面还有右括号时处理
while (symbol[p]!=‘)‘)
pop();//当括号内还有算式没有算完时进行运算
number[--p]=number[p + 1];//当运算完成以后左括号已经没有意义,所以将指针p移向前一个运算符,并复制所得的结果
} else {
//根据标志函数值作运算符入栈或出栈运算处理
while (can())
pop();// 当可以进行运算时运算,然后压入一个运算符
push();
}
i++;
} while (i<strlen(s)&&s[i-1]==‘)‘);//当检测到右括号时,可以运算括号内的内容
}
printf("Result=%d", number[0]);//这个是建立在最后有‘@’的情况下。因为所有的运算全部是建立在括号之内的,所以随着运算符的减少(运算符减少同时标志着需要操作的数减少)和最后的p--,结果一定保存在number[0]内
//printf("Result=%d",number[1]);
//如果需要不输入‘@’的运算式,则只需把从number【0】输出改为number【1】就好啦~
return 0;
}

时间: 2024-12-16 20:24:58

计算(calc.cpp)x 这题我搞了2晚上qwq的相关文章

9度oj 题目1000:计算a+b【水题】

题目1000:计算a+b 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:26087 解决:11745 题目描述: 求整数a,b的和. 输入: 测试案例有多行,每行为a,b的值. 输出: 输出多行,对应a+b的结果. 样例输入: 1 2 4 5 6 9 样例输出: 3 9 15 题解:java练习 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner

[solution]腾讯TEG_计算广告组_算法题

度娘笔试归来,题目实打实的,感觉真心不易,上百号人就抢那么几个坑......只恨自己平时积累太少啊~ 故曝一道鹅厂面试用的算法题(当时我就死在了这题上),来为度娘家攒一下RP~ 题目: 对于长度为N的一个无序的数组a[1..N],请将a进行排序,要求所有正数都排在0之前,所有负数都排在0之后(如果没有0,则所有正数排在负数前) 要求时间复杂度O(N),空间复杂度O(1) 题目不难,但给思考的时间很短,大约不到5分钟吧.当时脑子比较短路,于是只给出了O(n) O(n)复杂度的算法,然后就被面试官挂

求解:编程计算下列函数值第六题

jafm1b懒街游莆厮纳<http://weibo.com/p/230927983092304417918976?=D> cnb3p5寄彰环晌谧涸<http://weibo.com/20180414pp/230927983173412010598400> j5r537耗迪摆纳陶铀<http://weibo.com/20180414pp/230927983203319893729280> ka183j牡衔臀恍谐弛<http://weibo.com/p20180414

calc 多项式计算 (STL版和非STL版) -SilverN

计算(calc.cpp) [问题描述] 小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”求出的值就是密码.小明数学学得不好,还需你帮他的忙.(“/”用整数除法) [输入] 输入文件calc.in共1行,为一个算式. [输出] 输出文件calc.out共1行,就是密码. [输入样例]calc.in 1+(3+2)*(7^2+6*9)/(2) [输出样例]calc.out

1010: [HNOI2008]玩具装箱toy [dp][斜率优化]

Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<

2017河南工业大学ACM邀请赛A题

1260: 饶学妹的比赛 时间限制: 1 秒  内存限制: 64 MB提交: 334  解决: 102提交 状态 题目描述 饶学妹组织了一场ACM赛制的比赛,大家纷纷慕名来参加.比赛中大家交题只会有两种结果:AC,WA.比赛结束了,饶学妹制作榜单啦.首先按AC题目的数目(重复AC一道题只算一次)从多到少排名:AC题目数目相同的同学按罚时(罚时计算方式为:单题罚时 = (首次AC该题目时间 + 首次AC之前WA的次数 * 20) min,总罚时 = 各题罚时之和:即某题目AC之后,对这道题目后续的

题目1101:计算表达式(栈的使用)

题目链接:http://ac.jobdu.com/problem.php?pid=1101 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: // // 1101 计算表达式.cpp // Jobdu // // Created by PengFei_Zheng on 06/05/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <stdi

css之calc();

关于calc()这个css函数,有太大的作用了,相信熟悉css的朋友们,对这个函数都不会陌生,如果你属于这一类,那么你可以跳过了,因为这篇也没什么很重要的,只是对它的一些基本的介绍. 好了我是怎么开始接触到这个属性的呢,一定是当时遇到了什么问题,然后才发现了有这种方法.见下图: 那么由于要实现这种效果,开就真的用到这个css函数了,不然就得用js来做了,就太麻烦了.(如果这个例子有点牵强将将就一下吧),于是我与calc()就这样在茫茫码海中见面相遇了. calc()是可以在任何地方使用的<len

栈的应用--计算字符串表达式

计算机的本质工作就是做数学运算,那计算机可以读入字符串"1+2+3+4+5+6+7"并计算值吗? 答案是肯定的. 这里我基本实现了个位数的加减乘除,当然这个算法最简单的解决方式是采用二叉树(后面会实现~),这里作出了栈的实现方式. 首先引入两个概念: 中缀表达式和后缀表达式 1,在生活中我们通常书写1+1的时候都会写成1+1,废话~,这就是中缀表达式,更符合人们的思维习惯与想法. 2,所谓后缀表达式就是将运算符写在操作数的后面,这样更符合计算机的思维. 举例: 5 + 3