洛谷 P1022 [NOIP2000 T4] 计算器的改良
2016-10-28 00:06
183 查看
题目背景
NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。
题目描述
为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:4+3x=8
6a-5+1=2-2a
-5+12y=0
ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
输入输出格式
输入格式:一个一元一次方程。
输出格式:
解方程的结果(精确至小数点后三位)。
输入输出样例
输入样例#1:6a-5+1=2-2a
输出样例#1:
a=0.750
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
模拟+字符串~
思路很简单,可是好容易出错啊……
老师说用中缀表达式也能做?
模拟的话,具体就是循环,记录当前字符在‘=’之前还是之后,系数放入不同数组,最后统一计算,要注意的是如果分母为0,要输出0~
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,len,xi,now,z,zhe[1001][2],jian[1001][2]; double ans; char s[1001],dva; int main() { scanf("%s",s);len=strlen(s); if(s[now]>='0' && s[now]<='9') { int kkz=0; while(s[now]>='0' && s[now]<='9') (kkz*=10)+=s[now]-'0',now++; if(s[now]>='a' && s[now]<='z') xi+=kkz,dva=s[now],now++; else zhe[++zhe[0][z]][z]=kkz; } while(now<len) { if(s[now]=='=') now++,z=1; if(s[now]=='+') { int kkz=0;now++; while(s[now]>='0' && s[now]<='9') (kkz*=10)+=s[now]-'0',now++; if(s[now]>='a' && s[now]<='z') { dva=s[now];now++; if(!kkz) kkz=1; if(!z) xi+=kkz; else xi-=kkz; } else zhe[++zhe[0][z]][z]=kkz; } if(s[now]=='-') { int kkz=0;now++; while(s[now]>='0' && s[now]<='9') (kkz*=10)+=s[now]-'0',now++; if(s[now]>='a' && s[now]<='z') { dva=s[now];now++; if(!kkz) kkz=1; if(!z) xi-=kkz; else xi+=kkz; } else jian[++jian[0][z]][z]=kkz; } if(s[now]>='0' && s[now]<='9') { int kkz=0; while(s[now]>='0' && s[now]<='9') (kkz*=10)+=s[now]-'0',now++; if(s[now]>='a' && s[now]<='z') { dva=s[now];now++; if(!kkz) kkz=1; if(!z) xi+=kkz; else xi-=kkz; } else zhe[++zhe[0][z]][z]=kkz; } if(s[now]>='a' && s[now]<='z') dva=s[now++]; } double tot=0; for(int i=1;i<=zhe[0][0];i++) tot+=zhe[i][0]; for(int i=1;i<=zhe[0][1];i++) tot-=zhe[i][1]; for(int i=1;i<=jian[0][0];i++) tot-=jian[i][0]; for(int i=1;i<=jian[0][1];i++) tot+=jian[i][1]; printf("%c=",dva); if(xi==0) printf("0.000\n"); else printf("%.3lf\n",-tot/(double)xi); return 0; }
相关文章推荐
- NOIP 2000 计算器的改良 题解
- [NOIP2000] 提高组 洛谷P1022 计算器的改良
- 【NOIP提高组系列】(番外)NOIP2000计算器改良
- 洛谷 P1022 计算器的改良
- 洛谷 P1022 计算器的改良
- NOIP2000 计算器的改良
- [T][1]NOIP 2000 计算器的改良
- 计算器的改良(NOIP2000)
- noip2000-计算器的改良 2008.11.5
- NOIP2000普及组 计算器的改良 Codevs1015 字符串复杂处理
- noip2000计算器的改良 (模拟,解一元一次方程)
- NOIP2000计算器的改良
- luogu1022计算器的改良[noip2000提高组Day1 T1]
- 洛谷P1022 计算器的改良
- luogu1022计算器的改良[noip2000提高组Day1 T1]
- 洛谷——P1022 计算器的改良
- 洛谷 P1022 计算器的改良
- 洛谷 P1022 计算器的改良
- NOIP 2000 计算器的改良 解题报告
- 洛谷 P1004 [NOIP2000 T4] 方格取数