一本通1910:【00NOIP普及组】计算器的改良题解

今天是编程集训的第二天,也是我来到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
#include
#include
#include
#include
#include
#include
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也希望各位不论看谁的题解都能看完思路再看代码

你可能感兴趣的:(一本通题解,算法,开发语言,c++)