消失了一年的作者回来了,十分高兴能够再次见面。从今天开始,笔者争取每天都过一道比较有趣的题。ヾ(•ω•`)o
今天的题目: 暑假到了,被害人的数学老师给他布置了1万道数学计算题目,面对巨大的任务量,被害人几度哭晕在厕所,最后他决定采用学习的编程知识来完成这1万道题目,已知数学老师布置的题目都是一些不带括号的四则运算,例如123+234* 4+56/8=? 23-12-12*3=?由于被害人还没学习过小数,所以题目中的除法都是可以整除的。
-分析
其实意思还挺直观的了,就是要计算一个给定表达式(?)的值。那么具体的步骤是什么呢?
-步骤
笔者是这么想的。假设如果有这么两个列表。
- 一个存储所有运算的数字,一个存储所有的运算符。
- 根据运算符处理所有的数字,乘除法有限。
- 有一个变量记录着最后所有的和。
-代码实现
- C++版
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstring>
using namespace std;
int main(){
char a1[100]={},opstor[100]={};//创建两个列表,一个来存储表达式,一个来存储运算符号
int a[100]={}; //专门用来存储数字的列表。
int index=0,k=0,k1=0;
cin>>a1;
opstor[0]='+';//这里笔者假设头一个数是正数
for (int i=0;i<=strlen(a1)+1;i++) {//循环,遍历表达式里的所有元素
if (a1[i]=='*'||a1[i]=='/' || a1[i]=='+' || a1[i]=='-') { //如果是新的运算符...
opstor[k+1]=a1[i]; //更新运算符列表
a[k]=a[k]/pow(10,3-k1+1);//数字从原本的升位将回来,后面会提到。
k++;//存储数字列表中的新的数字
k1=0;
}
else if(a1[i]!='=' && a1[i]!=' '){
a[k]+=(a1[i]-48)*pow(10,3-k1);//在这里笔者为了将元素们成一个数字,将它们乘了一个数,这里假设不大于1000,后面会把多余的0除掉
k1++;//位数改变
}
else if (a1[i]=='=') { //等于号就结束了...
a[k]=a[k]/pow(10,3-k1+1); //数字进行最后一轮更新
k++; //数字和运算符数量更新
k1=0;
break; //停止运行.
}
}
int x=0;
for (int i=0;i<k;i++) {//在这个循环中,为了保证乘除的优先性,只算了乘除
if (opstor[i+1]=='*') {
a[i]=a[i]*a[i+1];
a[i+1]=0;//后面会加起来,所以要剔除多余的值
opstor[i+1]=opstor[i];
}
else if (opstor[i+1]=='/') {
a[i]=a[i]/a[i+1];
a[i+1]=0;
opstor[i+1]=opstor[i];
}
}
for (int i=0;i<k;i++) {
if (opstor[i]=='-') { //如果是减法就减掉数字
x-=a[i];
}
else { //其余就是加法
x+=a[i];
}
}
cout<<x<<endl; //输出答案
return 0;
}
-结果
这些样例测试都通过了,各位读者也可以自己试验一下,有问题可以跟我说。
-结语
其实这是一个比较简单的列表题吧,感兴趣的可以用栈或者结构体写一写。另外祝读者暑假愉快。笔者可能两天后会更新(不确定)。