CSUST 1506 ZZ的计算器 模拟题

题目描述:实现一个计算器,可以进行任意步的整数以内的加减乘除运算,运算符号只有+、-、*、/,求出结果。

解题报告:一个可以说麻烦的模拟题,我们可以这样,输入以字符串的形式输入,然后将输入先做一遍预处理,预处理要完成的是将其中所有的操作数和运算符号分开,我的做法是将操作数存放在一个数组里面,然后将运算符号也按同样的顺序存放在另一个数组里面,然后把所有的减法的运算转换成加上一个负数,这样在最后处理的时候就可以变得更简便,然后下一步就是运算处理,这一步我分成了两步来做,第一步,把其中所有的乘法和除法都算出来,然后这里有一个技巧就是将算出来的结果放在第二个位置,即加入一个数组有两位,现在要运算2*3,存放在数组里面的数是str[0] = 2,str[1] = 3;然后经过运算之后变成了这样,str[0] = 0,str[1] = 6;这里记住,一定要放在第二个位置,因为运算是逐渐往后的,如果放在前面的话,那后面的以为就必须是0,那么在0后面的数就只能和0进行运算了,同时在做除法的时候不要忘了一个东西就是在做之前,先判断被除的数是否为0,如果为0则推出,直接输出impossible。接下来的一步就很简单了,就是将经过上面各种操作的数组加起来就可以了,结果就得到了,另外很重要的一点就是这题的数据范围较大,要用long long型。下面给出代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 const int MAX = 1000+5;
 5 typedef long long ll;
 6 char str[MAX];
 7 ll str1[MAX],str2[MAX];
 8 
 9 ll atoll(char* p) {     //将一个字符串转化成long long型的数 
10     int len = strlen(p);
11     ll sum = 0;
12     for(int  i = 0;i<len;++i)
13     sum = 10*sum+p[i]-'0';
14     return sum;
15 }
16 
17 int main() {
18     while(scanf("%s",str)!=EOF) {
19         memset(str1,0,sizeof(str1));
20         memset(str2,0,sizeof(str2));
21         int len = strlen(str);
22         int tot = 0;
23         bool ye = 0;
24         for(int i = 0;i<len;++i) {
25             char x[MAX];
26             int j = 0;
27             while(str[i]>='0'&&str[i]<='9')
28             x[j++] = str[i++];
29             x[j] = NULL; //这个很重要,不然strlen测不出长度 
30             str1[tot] = atoll(x);
31             if(ye) {         //如果这个数对应的操作是减法的话,直接将这个数转化成负数 
32                 str1[tot]*=-1;
33                 ye = 0;
34             }
35             if(str[i] == NULL)   //当处理到最后一个数时,要及时推出 
36             break;
37             if(str[i]=='+')
38             str2[tot] = 1;
39             else if(str[i] == '-') {
40                 str2[tot] = 2;
41                 ye = 1;
42             }
43             else if(str[i] == '*')
44             str2[tot] = 3;
45             else str2[tot] = 4;
46             tot++;
47         }
48         bool flag = 0;
49         for(int i = 0;i<tot;++i) //运算过程 
50         if(str2[i]==3) {
51             str1[i+1] *= str1[i];
52             str1[i] = 0;
53         }
54         else if(str2[i] == 4) {
55             if(str1[i+1]==0) {
56                 flag = 1;
57                 break;
58             }
59             str1[i+1] = str1[i]/str1[i+1];
60             str1[i] = 0;
61         }
62         if(flag) {  //出现除数为0 的情况 
63             printf("impossible
");
64             continue;
65         }
66         ll ans = 0;
67         for(int i = 0;i<=tot+1;++i)
68         ans+=str1[i];
69         printf("%lld
",ans);
70         str[0] = NULL; //将输入的数组清空,很重要 
71     }
72     return 0;
73 }
View Code
原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3209510.html