山寨版计算器

题目来源:http://116.56.140.75:8000/JudgeOnline/problem.php?id=1735

1735: 山寨版计算器

时间限制: 1 Sec 内存限制: 64 MB

题目描述

我们日常生活中经常使用到一种被称为计算器的工具,这是一个有意思的发明,它可以代替人进行运算,而人只需要将数据输入即可。假设你是一个山寨计算器厂家的程序员,你的老板正要开发一种“新”的计算器,可以进行“+”、“-”、“*”、“\”这四种运算,而且输出有一定的精确度。由于你只负责一部分软件开发,所以运算顺序只需按照从左往右即可。请你按要求制作这个小程序。

输入

一个以“=”结尾的表达式,包含浮点数(也就是小数)和整数和四种合乎规范的运算符,且都用空格隔开,计算过程中数据范围都在double型数据的表示范围之内。输入数据中有浮点数。表达式有多个数据(少于10000个)

输出

一个答案,保留3位小数。

样例输入

1 + 2 - 1 * 4 / 5 + 1 - 1 =

解释:就像你自己在电脑上测试自己的程序一样,POJ会将一个字符串输入到你的程序里面,
这样一个字符串就是上面这个表达式“1 + 2 - 1 * 4 / 5 + 1 - 1 =”,其中的+,-,*,/也是一个个的字符,
可以使用IF语句判断,如:读入了一个“+”,那么把+号之前的值与之后读入的那个值加起来。
思考的时候可以多换换思路。

样例输出

1.600

提示

注意输出的答案最后需要换行。
读入的时候需要考虑空格的处理。
别傻了,真正的测试数据比
1 + 2 - 1 * 4 / 5 + 1 - 1 =
要长得多,而且有浮点数的存在(如123.0029)。

解析:我们可以读取整个字符串后再处理,也可以边读取边处理,就是要把数与运算符分开来

代码://读取完之后再处理

#include<iostream> 
#include<string> 
#include<cmath> 
#include<iomanip> 
using namespace std; 
int main() 
{ 
    string str; 
    getline(cin, str); 
    int num = str.size(); 
    double a[10000] = {}; 
    char ch[10000]; 
    int count = 0; 
    for (int i = 0; i < num - 1; i++) 
    { 
        if (str[i] == ' ') 
            count++; 
    } 
    int a_k = (count + 1) / 2 - 1; 
    int ch_k = (count - 1) / 2 - 1; 
    int a_kk = a_k, ch_kk = ch_k; 
    for (int i = num - 3; i >= 0;) 
    { 
        if (str[i] == ' ') 
        { 
            if (str[i + 1] == '+' || str[i + 1] == '-' || str[i + 1] == '*' || str[i + 1] == '/') 
                ch_k--; 
            i--; 
        } 
        else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') 
        { 
            ch[ch_k] = str[i]; 
            i--; 
        } 
        else
        { 
            int flag = 0; 
            int k = i; 
            for (; k >= 0; k--) 
            { 
                if (str[k] == ' ' || k == 0) 
                    break; 
                if (str[k] == '.') 
                { 
                    flag = 1; 
                    break; 
                } 
            } 
            if (flag) 
            { 
                k = k - i; 
                int j = i; 
                for (; j >= 0; j--) 
                { 
                    if (str[j] == ' ') 
                        break; 
                    if (str[j] != '.') 
                    { 
                        a[a_k] += (str[j] - '0')*pow(10, k); 
                        k++; 
                    } 
                } 
                i = j - 1; 
            } 
            else
            { 
                int j = i; 
                k = 0; 
                for (; j >= 0; j--) 
                { 
                    if (str[j] == ' ') 
                        break; 
                    else
                    { 
                        a[a_k] += (str[j] - '0')*pow(10, k); 
                        k++; 
                    } 
                } 
                i = j - 1; 
            } 
            a_k--; 
        } 
    } 
    double sum = a[0]; 
    for (int i = 0; i <= ch_kk; i++) 
    { 
        if (ch[i] == '+') 
            sum += a[i + 1]; 
        else if (ch[i] == '-') 
            sum -= a[i + 1]; 
        else if (ch[i] == '*') 
            sum *= a[i + 1]; 
        else if (ch[i] == '/') 
            sum /= a[i + 1]; 
    } 
    cout << fixed << setprecision(3) << sum << endl; 
    return 0; 
} 
/************************************************************** 
    Problem: 1735 
    User: 201730685257 
    Language: C++ 
    Result: 正确 
    Time:0 ms 
    Memory:1500 kb 
****************************************************************/
代码://边读取边处理
#include<iostream> 
#include<string> 
#include<cmath> 
#include<iomanip> 
using namespace std; 
int main() 
{ 
    char ch[10000]; 
    char s=' '; 
    double num = 0, sum = 0; 
    int i = 0, k = 0; 
    int flag = 0; 
    while ((ch[i] = getchar())!= '=') 
    { 
        if (ch[i] == ' ') 
        { 
            flag = 0; 
            if (ch[i - 1] == '+' || ch[i - 1] == '-' || ch[i - 1] == '*' || ch[i - 1] == '/') 
                continue; 
            num = 0; 
            int j = i - 1; 
            for (; j >= k; j--) 
            { 
                if (ch[j] == '.') 
                    flag = 1; 
            } 
            j = j - i; 
            if (flag) 
            { 
                for (int a = i - 1; a >= k; a--) 
                            { 
                                                                       if(ch[a]!='.')    
                                                                       { 
                                                                                num += (ch[a] - '0')*pow(10, j+3); 
                                j++; 
                                                                       } 
                                                                }  
            } 
            else
            { 
                j = 0; 
                for (int a = i - 1; a >= k; a--) 
                    num += (ch[a] - '0')*pow(10, j); 
                j++; 
            } 
                                                  
            if (s == ' ' || s == '+') 
                sum += num; 
            else if (s == '-') 
                sum -= num; 
            else if (s == '*') 
                sum *= num; 
            else if (s == '/') 
                sum /= num; 
        } 
        else if (ch[i] == '+' || ch[i] == '-' || ch[i] == '*' || ch[i] == '/') 
        { 
            s = ch[i]; 
            k = i + 1; 
        } 
        i++; 
    } 
    cout << fixed << setprecision(3) << sum << endl; 
    return 0; 
} 
/************************************************************** 
    Problem: 1735 
    User: 201730685257 
    Language: C++ 
    Result: 正确 
    Time:0 ms 
    Memory:1496 kb 
****************************************************************/
当然,这是题目对数字的处理机制,即四则运算优先级是一样的,那假如是我们正常的运算呢,即乘除高于加减,呵呵,只要稍作改动就可以了,一下附上代码:
#include<iostream> 
#include<string> 
#include<cmath> 
#include<iomanip> 
using namespace std; 
int main() 
{ 
    string str; 
    getline(cin, str); 
    int num = str.size(); 
    double a[10000] = {}; 
    char ch[10000]; 
    int count = 0; 
    for (int i = 0; i < num - 1; i++) 
    { 
        if (str[i] == ' ') 
            count++; 
    } 
    int a_k = (count + 1) / 2 - 1; 
    int ch_k = (count - 1) / 2 - 1; 
    int a_kk = a_k, ch_kk = ch_k; 
    for (int i = num - 3; i >= 0;) 
    { 
        if (str[i] == ' ') 
        { 
            if (str[i + 1] == '+' || str[i + 1] == '-' || str[i + 1] == '*' || str[i + 1] == '/') 
                ch_k--; 
            i--; 
        } 
        else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') 
        { 
            ch[ch_k] = str[i]; 
            i--; 
        } 
        else
        { 
            int flag = 0; 
            int k = i; 
            for (; k >= 0; k--) 
            { 
                if (str[k] == ' ' || k == 0) 
                    break; 
                if (str[k] == '.') 
                { 
                    flag = 1; 
                    break; 
                } 
            } 
            if (flag) 
            { 
                k = k - i; 
                int j = i; 
                for (; j >= 0; j--) 
                { 
                    if (str[j] == ' ') 
                        break; 
                    if (str[j] != '.') 
                    { 
                        a[a_k] += (str[j] - '0')*pow(10, k); 
                        k++; 
                    } 
                } 
                i = j - 1; 
            } 
            else
            { 
                int j = i; 
                k = 0; 
                for (; j >= 0; j--) 
                { 
                    if (str[j] == ' ') 
                        break; 
                    else
                    { 
                        a[a_k] += (str[j] - '0')*pow(10, k); 
                        k++; 
                    } 
                } 
                i = j - 1; 
            } 
            a_k--; 
        } 
    } 
    
    for(int i=0;i<=ch_kk;i++)
    {
        if(ch[i]=='*')
         {
              a[i+1]=a[i]*a[i+1];
              a[i]=0;
              ch[i]=='+';
          }
          else if(ch[i]=='/')
          {
              a[i+1]=a[i]/a[i+1];
              a[i]=0;
              ch[i]='+';
          }
       }
    double sum = a[0]; 
    for (int i = 0; i <= ch_kk; i++) 
    { 
        if (ch[i] == '+') 
            sum += a[i + 1]; 
        else if (ch[i] == '-') 
            sum -= a[i + 1];  
    } 
    cout << fixed << setprecision(3) << sum << endl; 
    return 0; 
} 





阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页