表达式系列问题

1)仅有加减法(高精度)

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 //#include<cctype> //不知道为什么没有cctype也可以用isdigit()函数 
 6 #deifne N 1511 
 7 using namespace std;
 8 int point=1,a[N],zhongzhuan[N],b[N];
 9 string s;
10 
11 void get_array(){//低位向高位转换 
12     memset(b,0,sizeof(b));
13     b[0]=zhongzhuan[0];//a[0]储存当前位数 
14     for(int i=1;i<=b[0];i++) b[i]=zhongzhuan[b[0]-i+1];
15     memset(zhongzhuan,0,sizeof(zhongzhuan));
16 }
17 
18 int cmp(){//大于返回1    小于返回-1    相等返回0 
19     if(a[0]>b[0]) return 1;//先比较位数 
20     if(a[0]<b[0]) return -1;
21     
22     for(int i=a[0];i>=1;i--){
23         if(a[i]>b[i]) return 1;
24         if(a[i]<b[i]) return -1;
25     }
26     
27     return 0;
28 }
29 
30 void plus_(){//加法 
31     int i,k;
32     k=a[0]>b[0]?a[0]:b[0];
33     for(i=1;i<=k;i++){
34         a[i+1]+=(a[i]+b[i])/10;
35         a[i]=(a[i]+b[i])%10;
36     }
37     if(a[k+1]>0) a[0]=k+1;
38     else a[0]=k;
39     return; 
40 }
41 
42 void gminus_(){//减法 
43     int flag=cmp();
44     if(flag==0) {memset(a,0,sizeof(a));return;}
45     if(flag==1){
46         for(int i=1;i<=a[0];i++){
47             if(a[i]<b[i]){--a[i+1];a[i]+=10;}
48             a[i]=a[i]-b[i];
49         }
50         while(a[a[0]]==0) a[0]--;
51         return;
52     }
53     if (flag==-1){//小于  则用a=b-a,返回-1
54         for(i=1;i<=b[0];i++){
55             if(b[i]<a[i]){ b[i+1]--;b[i]+=10;} //若不够减则向上借一位
56             a[i]=b[i]-a[i];
57         }
58         a[0]=b[0];
59         while(a[a[0]]==0) a[0]--; //修正a的位数
60         return;
61     }
62 }
63 
64 int main(){
65 //    freopen("01.txt","r",stdin);
66     getline(cin,s);
67     int fh=1;//操作符(FuHao) 
68     for(int i=0;i<s.size();i++){
69         if(isdigit(s[i])){//判断是否为数字 
70             zhongzhuan[point]=int(s[i]-'0');//point暂存中转位数 
71             zhongzhuan[0]=point++;//中转[0]暂存中转位数 
72         }
73         else{
74             get_array();
75             point=1;
76             
77             if(fh==1) plus_();    //1为+ 
78             else if(fh==-1) gminus_();//-1为- 
79             
80             fh=(s[i]=='+')?1:-1; 
81         }
82     }
83     
84     if(zhongzhuan[0]!=0){//伪清空栈(因为栈只有一个位置) 
85         get_array();
86         point=1;
87         if(fh==1) plus_();    //1为+ 
88         else if(fh==-1) gminus_();//-1为- 
89     }
90     
91     for(int i=a[0];i>=1;i--) printf("%d",a[i]);
92     puts(" ");
93     
94     return 0;
95 }

详见代码注释

2)加减乘除(注:此代码暂时无法处理负数情况)

//等价表达式问题:http://www.cnblogs.com/radiumlrb/p/5759319.html

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 long long check,final;
 7 long long num[55],op[55];
 8 string s;
 9 
10 long long power(long long a,long long b)
11 {
12     long long k=1;
13     for(int i=0;i<b;i++)
14         k*=a;
15     return k;
16 }
17 
18 void cul(int p,int op)
19 {
20     if(op==0) num[p-1]=num[p-1]+num[p];
21     if(op==1) num[p-1]=num[p-1]-num[p];
22     if(op==2) num[p-1]=num[p-1]*num[p];
23 //  if(op==3) num[p-1]=num[p-1]/num[p];
24     if(op==5) num[p-1]=power( num[p-1],num[p] );
25 }
26 
27 long long result(string str){
28     int op_nxt;//下一个操作符
29     int len=str.length(),p=-1,q=-1;//p数字栈指针 ,q符号栈指针 
30     long long num_nxt=0;
31     for(int i=0;i<len;i++){
32         if(str[i]=='a') num[++p]=check; 
33         else if(str[i]>='0'&&str[i]<='9') num_nxt=num_nxt*10+(str[i]-'0');
34         else if(str[i]!=' '){
35             if(num_nxt!=0){
36                 num[++p]=num_nxt;
37                 num_nxt=0;
38             }
39             if(str[i]=='+') op_nxt=0;
40             if(str[i]=='-') op_nxt=1;
41             if(str[i]=='*') op_nxt=2;
42 //          if(str[i]=='/') op_nxt=3;
43             if(str[i]=='^') op_nxt=5;
44             if(str[i]=='(') op_nxt=6;
45             if(str[i]==')') op_nxt=7;
46             if(op_nxt==6) op[++q]=op_nxt;
47             else if(op_nxt==7) while(q>=0&&op[q--]!=6) cul(p--,op[q+1]);
48             else {
49                 while(q>=0&&op[q]<=5&&op[q]/2>=op_nxt/2) cul(p--,op[q--]);
50                 op[++q]=op_nxt;
51             }
52         }
53     }
54     //清空堆栈
55     if(num_nxt!=0){ 
56         num[++p]=num_nxt;
57         num_nxt=0;
58     }
59     while(q>=0) cul(p--,op[q--]);
60     return num[0];
61 }
62 
63 int main(){
64     freopen("01.txt","r",stdin);
65     string str1,str2;
66     int n;
67     final=0;
68     getline(cin,str1);
69     cin>>n;
70     getline(cin,str2);
71     while(n--)
72     {
73         bool flag=true;
74         getline(cin,str2);
75         for (int i=10;i<=20;i++)
76         {
77             check=i;
78             if (result(str1)!=result(str2))
79             {
80                 flag=false;
81                 break;
82             }
83         }
84         if (flag) cout<<(char)('A'+final);
85         final++;
86     }
87     cout<<endl;
88     return 0;
89 }

讲一下Line 49,除以2是为了规定优先级

posted @ 2016-08-17 00:04  Radiumlrb  阅读(187)  评论(0编辑  收藏  举报