zoukankan      html  css  js  c++  java
  • 计算(calc.cpp) 这题我搞了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的范围内。
     1 #include<iostream>
     2 #include<cmath>
     3 #include<cstdio>
     4 #include<string>
     5 #include<cstring>
     6 
     7 using namespace std;
     8 
     9 int number[101],i=0, p=1;
    10 char symbol[101],s[256],t[256];
    11 
    12 void push() { //算符入栈运算
    13     symbol[++p]=s[i];
    14 }
    15 
    16 void pop() { //运算符栈顶元素出栈,并取出操作数栈元素完成相应的运算
    17     switch (symbol[p--]) { //运算完成之后扔掉运算符,也标志着需要运算的数已经运算完成
    18         case '+': {
    19             number[p]+=number[p + 1];
    20             break;
    21         }
    22         case '-': {
    23             number[p]-=number[p + 1];
    24             break;
    25         }
    26         case '*': {
    27             number[p]*=number[p + 1];
    28             break;
    29         }
    30         case '/': {
    31             number[p]/=number[p + 1];
    32             break;
    33         }
    34         case '^': {
    35             number[p]=pow(number[p],number[p + 1]);
    36         }
    37     }
    38 }
    39 
    40 bool can() { //判断运算符的优先级别,建立标志函数,能否进行运算
    41     if ((s[i]=='+'||s[i]=='-')&&symbol[p]!='(')//如果不是‘(’,则需要出栈,因为+与-的运算优先级别较低,仅仅比‘(’大
    42         return 1;
    43     if ((s[i]=='*'||s[i]=='/')&&(symbol[p]=='*'||symbol[p]=='/'))
    44 //若遇到乘除且运算符数组中对应的恰好是乘除,则需要出栈
    45         return 1;
    46     return 0;
    47 }
    48 
    49 bool judge(char s[256]) {
    50     int top=0,i=0;
    51     while (s[i]!='@') {
    52         if (s[i]=='(')top++;
    53         if (s[i]==')') {
    54             if (top>0) top--;
    55             else return 0;
    56         }
    57         i++;
    58     }
    59     if (top!=0) return 0; //检测栈是否为空。不空则说明有未匹配的括号
    60     else return 1;
    61 }
    62 
    63 int main() {
    64     gets(s);
    65     if(judge(s)==0) {
    66         cout<<"NO";
    67         return 0;
    68     }
    69 
    70     s[strlen(s)]=')';
    71     symbol[p]='(';
    72     while (i<strlen(s)) {
    73         while (s[i]=='(') { //左括号处理,压入左括号,有了左括号才能进行与右括号的匹配 while (symbol[p]!=‘(‘)
    74             push();
    75             i++;
    76         }
    77         int x=0;
    78         while (s[i]>='0'&&s[i]<='9') //取数入操作数栈
    79             x=x*10+s[i++]-'0';
    80         number[p]=x;
    81         do {
    82             if (s[i]==')') { //当右括号后面还有右括号时处理
    83                 while (symbol[p]!=')')
    84                     pop();//当括号内还有算式没有算完时进行运算
    85                 number[--p]=number[p + 1];//当运算完成以后左括号已经没有意义,所以将指针p移向前一个运算符,并复制所得的结果
    86             } else {
    87 //根据标志函数值作运算符入栈或出栈运算处理
    88                 while (can())
    89                     pop();// 当可以进行运算时运算,然后压入一个运算符
    90                 push();
    91             }
    92             i++;
    93         } while (i<strlen(s)&&s[i-1]==')');//当检测到右括号时,可以运算括号内的内容
    94     }
    95     printf("Result=%d", number[0]);//这个是建立在最后有‘@’的情况下。因为所有的运算全部是建立在括号之内的,所以随着运算符的减少(运算符减少同时标志着需要操作的数减少)和最后的p--,结果一定保存在number[0]内
    96 //printf("Result=%d",number[1]);
    97 //如果需要不输入‘@’的运算式,则只需把从number【0】输出改为number【1】就好啦~
    98     return 0;
    99 }

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    P4910 帕秋莉的手环
    P3216 [HNOI2011]数学作业
    洛谷 P2894 [USACO08FEB]酒店
    [网络流24题]魔术球问题
    [网络流24题]飞行员配对方案问题
    [网络流24题]最小路径覆盖问题
    洛谷 P1503鬼子进村
    BZOJ 3631: [JLOI2014]松鼠的新家
    洛谷 P2922 [USACO08DEC]秘密消息Secret Message
    洛谷 P1379 八数码难题
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6636754.html
Copyright © 2011-2022 走看看