您的位置:首页 > 其它

计算器的改良

2018-03-07 21:29 141 查看
DescriptionNCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例: 

4+3x=8 
6a-5+1=2-2a 
  -5+12y=0 

ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。 

编写程序,解输入的一元一次方程, 将解方程的结果(精确至小数点后三位)输出至屏幕。 

你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。 
Input一个一元一次方程式Output方程的结果(精确至小数点后三位)Sample Input6a-5+1=2-2aSample Outputa=0.750SourceNIOP2000普及组第一题详解见代码注释,有一个巧妙之处就是对于符号的处理以及判断。#include<cstdio>

int main()
{
int op=1,dir=1,num=0,a=0,b=0;
char ch,id;
while((ch=getchar())!=EOF)
{
if(ch>='a'&&ch<='z')             //如果是变量,
{
id=ch;             //用id记录变量名
if(num==0)
num=1;             //前面如果没有系数,则系数是1
a+=op*num*dir;     //不管有没有,最终都加入运算
num=0; //让num回归常态
}
else if(ch>='0'&&ch<='9')                 //如果是数字,用num记录下来数值
num=num*10+ch-'0';
else //如果既不是变量,又不是数字,那就是运算符号。
{

b+=op*dir*num; /*巧妙之处*/

num=0; //算是对num、op的一种重置
op=1;         //让他们回到原始应该有的状态,不影响以后的操作及判断

if(ch=='=')     //dir和op一样,用来表示数值的符号
dir=-1;
else if(ch=='-')
op=-1;
}
}
printf("%c=%.3f",id,(float)-b/a+0); //此处的思想是ax+b=0;即x=-b/a;
return 0;
}觉得不错的老铁们请点个赞,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 POJ