zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    如何检测死锁并快速定位死锁位置
    几种线程本地存储变量和普通变量的性能比较
    multi_index_container性能测试
    [高并发引擎]定时器模块
    [高并发引擎]Log模块
    静态博客教程 1:hexo + github
    蛇形填数
    实现简单的 ls 命令
    静态库与动态库的创建和使用
    用两个栈实现队列
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3209510.html
Copyright © 2011-2022 走看看