XCOJ: 计算器

Posted William_xh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XCOJ: 计算器相关的知识,希望对你有一定的参考价值。

题目地址:http://xcacm.hfut.edu.cn/problem.php?id=1251

就和表达式求值有点像,但是和杭电的哪一题不一样的是中间没有空格,那么就意味着必须通过字符串处理的方式来解决这个问题。

(OS:mmp 劳资测试了快一整天才得出这个结论,因为用cin的话它是一次性读取的,你再cin除非是你再次输入或者中间有空格,杭电的那个计算器就是通过空格实现的);

再OS:当年考试这题还一直以为要用堆栈做,其实这么看来并不需要。

 

首先是字符串转化数字,这个很简单。

其次是第一个数要单独处理。

然后就是,每当str[i]为减号或者加号的时候,我就把符号后面的那个数给提取出来,这个可以用一个循环实现。

 

接下来附上代码

#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<stdlib.h>
#include<iterator>
#include<sstream>
#include<string.h>
#include<stdio.h>
using namespace std;
//1250
int main()
{

    string str;

    int len;//字符串长度
    int sum;//总和
    int temp;//临时数
    int pos;
    int num[100];
    while(cin>>str)
    {
        len=str.length();
        memset(num,0,sizeof(num));
        sum=0;
        temp=0;
        pos=0;

        for(int i=0;i<len;i++)//第一个数要单独处理
        {
            if(pos==0)
            {
                for(int k=0;k<len;k++)
                {
                    if(str[k]>=0&&str[k]<=9)
                    {
                        temp=temp*10+str[k]-0;
                    }
                    else{
                        break;
                    }
                }
                num[pos]=temp;
                temp=0;
                pos++;

            }
            if(str[i]==+)//一旦遇到符号 就把它后面那个数给提取出来
            {
                for(int j=i+1;j<len;j++)//通过循环实现
                {
                    if(str[j]>=0&&str[j]<=9)
                    {
                        temp=temp*10+str[j]-0;
                    }
                    else{//如果遇到了符号  或者是 最后一个数
                        break;//就跳出循环
                    }
                }
                num[pos]=temp;
                temp=0;
                pos++;
            }
            if(str[i]==-)
            {
                for(int jj=i+1;jj<len;jj++)
                {
                    if(str[jj]>=0&&str[jj]<=9)
                    {
                        temp=temp*10+str[jj]-0;
                    }
                    else{
                        break;
                    }
                }
                num[pos]=-temp;//当然 是减号的话 当然是放复数了
                temp=0;
                pos++;
            }
        }

        for(int ii=0;ii<pos;ii++)
        {
            sum=sum+num[ii];
        }
        cout<<sum<<endl;


    }
    return 0;
}

 

以上是关于XCOJ: 计算器的主要内容,如果未能解决你的问题,请参考以下文章

1170: 非常男女(XCOJ 前缀和)

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销

Android:向活动添加片段

从JVM的角度看JAVA代码--代码优化

Vue3官网-高级指南(十七)响应式计算`computed`和侦听`watchEffect`(onTrackonTriggeronInvalidate副作用的刷新时机`watch` pre)(代码片段

golang代码片段(摘抄)