今天是编程集训的第二天,也是我来到CSDN整整1年。感谢所有阅读过我的文章的人,谢谢。
今天的比赛难度略低于昨天,但这道题也卡了我好久。
进入正题
题目:
题目描述:
NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:
4+3x=8
6a-5+1=2-2a
-5+12y=0
ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“─”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
输入
编写程序,解输入的一元一次方程
输出
将解方程的结果(精确至小数点后三位)输出
样例:
输入:
6a-5+1=2-2a
输出:
a=0.750
思路
这道题可以看出来,不需要任何的算法,那就是一个大大大大大模拟,一堆细节需要注意,甚至还有个坑点:有个测试点应该输出0.000,但运算结果是-0.000,就很坑人。
由于没什么思路,直接上代码吧
代码
//主体代码
while(cin>>c) //不断输入
{
if(c>='0' && c<='9') //是数字
{
cnt=cnt*10+c-'0';
}
if(c=='+') //运算
{
sum+=f*r*cnt;
f=1,cnt=0;
}
if(c=='-')f表示下一个数应该+还是-,若是+则*1没有变化,若是-则*-1变成负数
{
sum+=f*r*cnt;
f=-1,cnt=0;
}
if(c=='=')
{
sum+=r*f*cnt;
r=-1,f=1;//r表示等号后的所有运算符会改变,所以都需要*-1
cnt=0;
}
if(c>='a' && c<='z') //记录未知数
{
x=c;
if(cnt) sumx+=f*r*cnt;
else sumx+=f*r;
cnt=0;
}
}
完整代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<stack>
#include<queue>
using namespace std;
char c,x;
int sum,sumx;
int r=1,f=1,cnt;
double res;
int main()
{
while(cin>>c)
{
if(c>='0' && c<='9')
{
cnt=cnt*10+c-'0';
}
if(c=='+')
{
sum+=f*r*cnt;
f=1,cnt=0;
}
if(c=='-')
{
sum+=f*r*cnt;
f=-1,cnt=0;
}
if(c=='=')
{
sum+=r*f*cnt;
r=-1,f=1;
cnt=0;
}
if(c>='a' && c<='z')
{
x=c;
if(cnt) sumx+=f*r*cnt;
else sumx+=f*r;
cnt=0;
}
}
sum+=f*r*cnt;
res=-sum*1.0/sumx;
if(res==0.0) res=0;
printf("%c=%.3lf",x,res);
return 0;
}
没登陆的复制链接
云剪贴板 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/paste/uudqs2q5也希望各位不论看谁的题解都能看完思路再看代码