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