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

258

【限制】

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

用栈来处理运算顺序。把数和符号存在不同的栈中。每次读到数后检查已经入栈的运算符号,能算的就先算完。

如读到‘^‘,直接算出乘方结果压入栈中,而读到‘*‘‘/‘要先检查下一个符号是不是‘^‘,不是的话才能算结果,加减同理……

以下的代码有一个已知的小bug:不支持自动消除空格(懒得写)读入的时候要是有空格,程序会爆炸。

代码(未使用STL):

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int a[200];//数栈
 7 int p,i;
 8 char sy[200],c[200];//符号栈  原算式 9 void push(){
10     sy[++p]=c[i];
11 }
12 void pp(){//弹栈运算
13     switch(sy[p--]){
14         case ‘+‘:a[p]+=a[p+1];break;
15         case ‘-‘:a[p]-=a[p+1];break;
16         case ‘*‘:a[p]*=a[p+1];break;
17         case ‘/‘:a[p]/=a[p+1];break;
18         case ‘^‘:a[p]=pow(a[p],a[p+1]);break;
19
20     }
21     return;
22 }
23 int can(){//优先级判断
24     if((c[i]==‘+‘||c[i]==‘-‘)  && sy[p]!=‘(‘)return 1;
25     if((c[i]==‘*‘||c[i]==‘/‘)  && (sy[p]==‘*‘ || sy[p]==‘/‘))return 1;
26     return 0;
27 }
28 int main(){
29     p=1;i=0;
30     cin>>c;
31     c[strlen(c)]=‘)‘;
32     sy[p]=‘(‘;
33 //
34     printf("test");
35     while(i<strlen(c)){
36         while(c[i]==‘(‘){//处理左括号
37             push();
38             i++;
39         }
40         int x=0;
41         while(c[i]>=‘0‘&& c[i]<=‘9‘){//处理数字
42             x=x*10+c[i++]-‘0‘;
43         }
44         a[p]=x;
45         do{
46             if(c[i]==‘)‘){//处理右括号
47                 while(sy[p]!=‘(‘)pp();
48                 a[--p]=a[p+1];
49
50             }
51             else{
52                 while(can())pp();
53                 push();
54             }
55             i++;
56         }while(i<strlen(c) && c[i-1]==‘)‘);
57
58     }
59     printf("%d",a[p]);
60     return 0;
61 }

代码(STL):

STL真好用

 1 /**/
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<stack>
 6 #include<cstring>
 7 using namespace std;
 8 char c[200];
 9
10 stack<int>num;//数
11 stack<char>sy;//符号
12 int pow1(int a,int b){//自写乘方
13     int i;
14     for(i=2;i<=b;i++){
15         a*=a;
16     }
17     return a;
18 }
19 void mth(){//运算
20     int a,b;
21     char ch;
22     b=num.top();
23     num.pop();
24     a=num.top();
25     num.pop();
26     ch=sy.top();
27     sy.pop();
28     switch(ch){
29         case ‘+‘: num.push(a+b);break;
30         case ‘-‘: num.push(a-b);break;
31         case ‘*‘: num.push(a*b);break;
32         case ‘/‘: num.push(a/b);break;
33         case ‘^‘: num.push(pow1(a,b));break;
34         default: break;
35     }
36     return;
37 }
38 int cmp(int ch){//优先级判断,没有严谨验证过,初步测试没有问题 //注释掉的那部分代码来自大神yhy,保证无误
39     if(sy.empty() || sy.top()==‘(‘)return 0;
40     if(ch==‘+‘ || ch==‘-‘)return 1;
41     if(sy.top()==‘^‘)return 1;
42     if((ch==‘*‘ || ch==‘/‘) && (sy.top()==‘*‘ ||sy.top()==‘/‘))return 1;
43     return 0;
44 /*    if (sy.empty()||sy.top()==‘(‘) return 0;
45     if (sy.top()==‘^‘) return 1;
46     if (ch==‘^‘) return 0;
47     if (sy.top()==‘*‘||sy.top()==‘/‘) return 1;
48     if (ch==‘*‘||ch==‘/‘) return 0;
49     return 1;*/
50 }
51 int main(){
52     gets(c);
53     int len=strlen(c);
54     c[len]=‘)‘;
55     sy.push(‘(‘);
56     int i;
57     for(i=0;i<=len;i++){
58         if(c[i]==‘(‘){
59             sy.push(‘(‘);
60             continue;
61         }
62         if(c[i]>=‘0‘ && c[i]<=‘9‘)
63         {
64             int x=0;
65             while(c[i]>=‘0‘ && c[i]<=‘9‘){
66                 x=x*10+c[i]-‘0‘;
67                 i++;
68             }
69             i--;
70             num.push(x);
71             continue;
72         }
73         if(c[i]==‘)‘){
74             while(sy.top()!=‘(‘)mth();
75             sy.pop();
76             continue;
77         }
78         while(cmp(c[i]))mth();
79         sy.push(c[i]);
80     }
81     while(!sy.empty())mth();
82     printf("%d ",num.top());
83     return 0;
84 }
时间: 2024-10-26 16:36:51

calc 多项式计算 (STL版和非STL版) -SilverN的相关文章

stl文件格式解析代码--java版

代码是参考three.js中的stlLoader.js写的. 需要注意的地方,java中byte取值-128~127 package test_stl.test_entry; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.util.regex.Matcher; import java.util.regex.Pattern;

非递归版求幂函数

#include<stdio.h> int MinSubsequenceSum(const int A[],int n) { int i,sum,MinSum; sum=MinSum=0; for(i=0;i<n;i++) { sum+=A[i]; if(sum<MinSum) MinSum=sum; if(sum>0) sum=0; } return MinSum; } void main() { int arr[10]={3,4,-2,5,-4,6,-2,8,-9,-23

购物车非cookie版

2015.11.26购物车,非cookie版 [点击来,你发现被骗了(笑哭,笑哭,笑哭,源代码的话,留下邮箱吧,是在不好找这一时半会儿的.)] Jsp通过反射机制获取bean中的标签,但其实,可以没有真实的属性与之对应.只要是符合getset方法设置的名字,就可以通过el表达式在jsp页面中获取. 更新核心代码: private void update(HttpServletRequest request, HttpServletResponse response) throws Servlet

POJ 1780 Code (欧拉回路+非递归版dfs)

题目地址:POJ 1780 还是求序列的欧拉回路.只不过这题有两坑. 第一坑是用数字来当点的话,会MLE,因为每个数字可以连10条边,100w条边会MLE,即使用vector也会TLE.这题可以用边来记录,对于n为1时直接输出,然后后面的,比如12,23这两个点就用边权值为123来表示这两个点,这样就把点和边的范围都缩小了10倍. 第二坑是用递归的dfs会爆栈,亲测即使加手扩栈也会爆..(简直丧心病狂..)需要用非递归版dfs,也不难,dfs本身就是利用的栈,所以改成栈的形式就可以了. 代码如下

多项式计算的效率测试

多项式计算调用库函数pow方法和秦九韶算法,我们来测算下他们的运行效率 计算函数f(x)=1+(Σxi/i)(i从1取到m); 用ctime时间函数来测试运行时间,带入x=0.9来计算 #include<iostream>#include<cmath>;#include<ctime>using namespace std;double Fn1(double x);double Fn2(double x);#define m 1000000000clock_t start

CSS3 calc() 会计算的属性

CSS3 calc() 会计算的属性 calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,你可以使用calc()给元素的border.margin.pading.font-size和width等属性设置动态值. 以前我们可以使用box-sizing:border-box;来设置盒子的属性为不加上边距.现在我们又多了一个选择了.但要注意,两者只能使用一个哦,否则就会造成冲突了. 怎么使用 calc()可以使用数学运算中的简单加(+).减(-).乘(*)和除(/)来解决问

多项式计算的Horner 方法

Horner 算法是以英国数学家 William George Horner 命名的一种多项式求值的快速算法,实际上,这种快速算法在他之前就已经被Paolo Ruffini使用过了.而中国数学家秦九韶提出这种算法要比William George Horner 早600多年. P(x) 是一个多项式: 我们希望计算x取某个特殊值x0时多项式的值p(x0). 构造一个序列: 那么这个序列b0的值就是多项式的值了. 用程序实现如下: double horner(double p[], int n, d

SpringBoot整合Mybatis【非注解版】

接上文:SpringBoot整合Mybatis[注解版] 一.项目创建 新建一个工程 ? 选择Spring Initializr,配置JDK版本 ? 输入项目名 ? 选择构建web项目所需的staters(启动器) ? 选择与数据库相关的组件 ? 分析:Spring Boot基本上将我们实际项目开发中所遇到的所有场景都做了封装.它将所有的功能场景都抽取出来,做成了一个个的staters(启动器),只需要在项目的pom.xml配置文件里面引入这些starter相关场景的所有依赖都会导入进来.需要什

巧用CSS3的calc()宽度计算做响应模式布局代码分享

巧用CSS3的calc()宽度计算做响应模式布局代码分享,这里我们先看下老外程序员写的: Dealing with CSS browser compatibility and solving technical issues is probably the real charm (I mean it) of front-end development. None of the projects do without it. Working on one of those I finally ha