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型。下面给出代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
const int MAX = +;
typedef long long ll;
char str[MAX];
ll str1[MAX],str2[MAX]; ll atoll(char* p) { //将一个字符串转化成long long型的数
int len = strlen(p);
ll sum = ;
for(int i = ;i<len;++i)
sum = *sum+p[i]-'';
return sum;
} int main() {
while(scanf("%s",str)!=EOF) {
memset(str1,,sizeof(str1));
memset(str2,,sizeof(str2));
int len = strlen(str);
int tot = ;
bool ye = ;
for(int i = ;i<len;++i) {
char x[MAX];
int j = ;
while(str[i]>=''&&str[i]<='')
x[j++] = str[i++];
x[j] = NULL; //这个很重要,不然strlen测不出长度
str1[tot] = atoll(x);
if(ye) { //如果这个数对应的操作是减法的话,直接将这个数转化成负数
str1[tot]*=-;
ye = ;
}
if(str[i] == NULL) //当处理到最后一个数时,要及时推出
break;
if(str[i]=='+')
str2[tot] = ;
else if(str[i] == '-') {
str2[tot] = ;
ye = ;
}
else if(str[i] == '*')
str2[tot] = ;
else str2[tot] = ;
tot++;
}
bool flag = ;
for(int i = ;i<tot;++i) //运算过程
if(str2[i]==) {
str1[i+] *= str1[i];
str1[i] = ;
}
else if(str2[i] == ) {
if(str1[i+]==) {
flag = ;
break;
}
str1[i+] = str1[i]/str1[i+];
str1[i] = ;
}
if(flag) { //出现除数为0 的情况
printf("impossible\n");
continue;
}
ll ans = ;
for(int i = ;i<=tot+;++i)
ans+=str1[i];
printf("%lld\n",ans);
str[] = NULL; //将输入的数组清空,很重要
}
return ;
}
CSUST 1506 ZZ的计算器 模拟题的更多相关文章
- poj 1008:Maya Calendar(模拟题,玛雅日历转换)
Maya Calendar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64795 Accepted: 19978 D ...
- poj 1888 Crossword Answers 模拟题
Crossword Answers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 869 Accepted: 405 D ...
- CodeForces - 427B (模拟题)
Prison Transfer Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Sub ...
- sdut 2162:The Android University ACM Team Selection Contest(第二届山东省省赛原题,模拟题)
The Android University ACM Team Selection Contest Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里 ...
- 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
题目名称 正确答案 序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer. ...
- UVALive 4222 Dance 模拟题
Dance 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&pag ...
- cdoj 25 点球大战(penalty) 模拟题
点球大战(penalty) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/2 ...
- Educational Codeforces Round 2 A. Extract Numbers 模拟题
A. Extract Numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/600/pr ...
- URAL 2046 A - The First Day at School 模拟题
A - The First Day at SchoolTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudg ...
随机推荐
- Linux内核分析作业 NO.5
拔掉系统调用的三层皮(下) 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...
- ns3的输入输出奥秘(二) 命令行参数
命令行参数 (1) UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9); echoClient.SetAttribute (&q ...
- HDU 2051 Bitset
http://acm.hdu.edu.cn/showproblem.php?pid=2051 Problem Description Give you a number on base ten,you ...
- CentOS7 如何修改 内核版本
1. 参考blog http://www.mamicode.com/info-detail-1758066.html https://www.cnblogs.com/sexiaoshuai/p/839 ...
- 3.23日PSP
工作 类型 日期 开始时间 结束时间 中断时间 净时间 搭hadoop环境(已终止) 技能 3.23 00:00 00:50 0min 50min 看构建之法 学习 3.23 9:30 10:00 3 ...
- 导入appiumlibrary显红
1.点击ride中的Tools的View RIDE Log 2.打开日志报如下错误,提示没有six这个模块,可能是最新包的要对python版本兼容 3.所以使用pip install six安装包后 ...
- 【大数据】SparkStreaming学习笔记
第1章 Spark Streaming概述 1.1 Spark Streaming是什么 Spark Streaming用于流式数据的处理.Spark Streaming支持的数据输入源很多,例如:K ...
- P2704 [NOI2001]炮兵阵地
题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最 ...
- How do you add? UVA - 10943(组合数的隔板法!!)
题意: 把K个不超过N的非负整数加起来,使它们的和为N,有多少种方法? 隔板法...不会的可以买一本高中数学知识清单...给高中班主任打个广告.... 隔板法分两种...一种是不存在空集 = C(n- ...
- 【洛谷】NOIP2018原创模拟赛DAY1解题报告
点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...