简单计算器(递归写法)
2015-07-20 11:41
357 查看
暑假集训练手一发: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83171#overview
Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
思想很简单:递归处理,先做乘除!(写的很挫)
// http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83171#overview #include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
vector <double> IQ;
vector <char> CQ;
double solve(int p){
//if(p==IQ.size()-1)return IQ[p];
//if(CQ[p]=='+')return IQ[p]+solve(p+1);
//if(CQ[p]=='-')return IQ[p]-solve(p+1);
double x = IQ[p];
while((p<IQ.size()-1)&&(CQ[p]=='*'||CQ[p]=='/')){
if(CQ[p]=='*')x=x*IQ[p+1];
if(CQ[p]=='/')x=x/IQ[p+1];
p++;
}
if(p==IQ.size()-1)return x;
if(CQ[p]=='+')return x+solve(p+1);
if(CQ[p]=='-'){
int q = p+1;
while(q<CQ.size()){
if(CQ[q]=='+')CQ[q]='-';
else if(CQ[q]=='-')CQ[q]='+';
q++;
}
return x-solve(p+1);
}
}
int main(){
char str[222];
while(gets(str),strcmp(str,"0")!=0){
// puts(str);
int len = strlen(str);
IQ.clear();
CQ.clear();
for(int i=0;i<len;i++){
int x=0;
bool flag = false;
while(i<len&&isdigit(str[i])){
x=x*10+str[i]-'0';
i++;
flag = true;
}
if(flag)
IQ.push_back(x*1.0);
else
CQ.push_back(str[i++]);
}
// cout<<IQ.size()<<endl;
// for(int i=0;i<IQ.size();i++)cout<<IQ[i]<<" ";cout<<endl;
// cout<<CQ.size()<<endl;
// for(int i=0;i<CQ.size();i++)cout<<CQ[i]<<"";cout<<endl;
double ans = solve(0);
printf("%.2lf\n",ans);
}
return 0;
}
Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
思想很简单:递归处理,先做乘除!(写的很挫)
// http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83171#overview #include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
vector <double> IQ;
vector <char> CQ;
double solve(int p){
//if(p==IQ.size()-1)return IQ[p];
//if(CQ[p]=='+')return IQ[p]+solve(p+1);
//if(CQ[p]=='-')return IQ[p]-solve(p+1);
double x = IQ[p];
while((p<IQ.size()-1)&&(CQ[p]=='*'||CQ[p]=='/')){
if(CQ[p]=='*')x=x*IQ[p+1];
if(CQ[p]=='/')x=x/IQ[p+1];
p++;
}
if(p==IQ.size()-1)return x;
if(CQ[p]=='+')return x+solve(p+1);
if(CQ[p]=='-'){
int q = p+1;
while(q<CQ.size()){
if(CQ[q]=='+')CQ[q]='-';
else if(CQ[q]=='-')CQ[q]='+';
q++;
}
return x-solve(p+1);
}
}
int main(){
char str[222];
while(gets(str),strcmp(str,"0")!=0){
// puts(str);
int len = strlen(str);
IQ.clear();
CQ.clear();
for(int i=0;i<len;i++){
int x=0;
bool flag = false;
while(i<len&&isdigit(str[i])){
x=x*10+str[i]-'0';
i++;
flag = true;
}
if(flag)
IQ.push_back(x*1.0);
else
CQ.push_back(str[i++]);
}
// cout<<IQ.size()<<endl;
// for(int i=0;i<IQ.size();i++)cout<<IQ[i]<<" ";cout<<endl;
// cout<<CQ.size()<<endl;
// for(int i=0;i<CQ.size();i++)cout<<CQ[i]<<"";cout<<endl;
double ans = solve(0);
printf("%.2lf\n",ans);
}
return 0;
}
相关文章推荐
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- C#中的尾递归与Continuation详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- Javascript递归打印Document层次关系实例分析
- 一个简单的jQuery计算器实现了连续计算功能
- js表达式计算器代码
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- javascript简单计算器 可美化
- C# 递归查找树状目录实现方法
- 从零开始学android实现计算器功能示例分享(计算器源码)
- 全排列算法的非递归实现与递归实现的方法(C++)
- php递归列出所有文件和目录的代码
- 用JS写的简单的计算器实现代码
- java递归菜单树转换成pojo对象
- 一个JavaScript递归实现反转数组字符串的实例