题目描述:实现一个计算器,可以进行任意步的整数以内的加减乘除运算,运算符号只有+、-、*、/,求出结果。
解题报告:一个可以说麻烦的模拟题,我们可以这样,输入以字符串的形式输入,然后将输入先做一遍预处理,预处理要完成的是将其中所有的操作数和运算符号分开,我的做法是将操作数存放在一个数组里面,然后将运算符号也按同样的顺序存放在另一个数组里面,然后把所有的减法的运算转换成加上一个负数,这样在最后处理的时候就可以变得更简便,然后下一步就是运算处理,这一步我分成了两步来做,第一步,把其中所有的乘法和除法都算出来,然后这里有一个技巧就是将算出来的结果放在第二个位置,即加入一个数组有两位,现在要运算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 }