1 条题解
-
0
自动搬运
来自洛谷,原作者为

minecraft_herobrine
Ȃ̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̮̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑̑搬运于
2025-08-24 21:27:57,当前版本为作者最后更新于2019-06-15 13:47:07,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
首先,先看一下这道题可能需要什么算法

咦?这怎么和猪国*一样啊

哈哈哈哈哈
好了不闹了这道题需要进行字符串模拟,但是这道题的表达式里会有空格和回车,就像
x +y = z这样,这就需要过滤空格了。不过scanf("%c",&ch)是可以读入空格和回车的所以我们在读入是可以使用
while(scanf("%c",&s[i++])!=EOF); len=i-1;进行读入。
下面就开始模拟了(敲黑板)
因为在读入时没有过滤空格(scanf都读进去了),所以模拟时需要过滤空格。显然需要判断如果是空格就continue。
而题目中表达式的表示方法是
x+(或者-)y=z,所以在整个表达式中出现非数字字符只能是+(-)和=,空格已经被过滤。所以这把整个表达式分成了三部分,每个部分都是一个整数,我们可以用x,y,z来表示。
模拟过程我们需要两个状态变量,一个是3个状态,表示当前在表达式的哪个部分,另一个有两个状态,表示表达式是加法还是减法。所以模拟时需要分类讨论符号,具体的模拟过程在代码中解释
#include<bits/stdc++.h> using namespace std; const int INF=2147483647;//这里可以看出哪个数是未给出的数 char s[100]; int main() { int len,i=1,x=0,y=0,z=0,op=0; bool op_add=true; //这里op表示当前处于表达式的哪个部分,op_add表示当前表达式是加法还是减法,x,y,z都要给初值,否则后面会出错 while(scanf("%c",&s[i++])!=EOF);//读入,暂时不忽略空格 len=i-1;//长度,在读入时多了一个,需要-1 for(i=1;i<=len;i++) { if(s[i]==' ') continue;//这里过滤空格 else if(s[i]>='0' && s[i]<='9')//处理数字 { if(op==0) x=x*10+(s[i]-'0');//看这是在哪个部分 else if(op==1) y=y*10+(s[i]-'0');//不同的部分表示不同的数 else if(op==2) z=z*10+(s[i]-'0');//如果这里没给初值的话,那这就是乱码,会WA } else if(s[i]=='+') op=1;//如果遇到'+',说明已经到了第二部分(+或-和=号之间) else if(s[i]=='-') op=1,op_add=false;//如果是-,那就把op_add=false,后面需要判断 else if(s[i]=='=') op=2;//到=了,说明到第三部分了 else if(s[i]=='?')//遇到了未知数 { if(op==0) x=INF;//记录下来 else if(op==1) y=INF;//INF相当于标记 else if(op==2) z=INF; } } if(op_add)//处理完毕,如果表达式是加法 { if(x==INF) printf("%d",z-y);//加数=和-另一个加数 else if(y==INF) printf("%d",z-x); else if(z==INF) printf("%d",x+y);//和=... } else//如果是减法 { if(x==INF) printf("%d",z+y);//同理了呗~~ else if(y==INF) printf("%d",x-z); else if(z==INF) printf("%d",x-y); } // printf("\n%d %d %d",x,y,z);//这是调试的语句 return 0;//结束 }最后求管理大大过QAQ
- 1
信息
- ID
- 679
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者