计算器的改良 (模拟)

来源:互联网 发布:python web 开发 编辑:程序博客网 时间:2024/04/30 10:04

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

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

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

问题求解

编写程序,解输入的一元一次方程, 将解方程的结果(精确至小数点后三位)输出至屏幕。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。输入保证方程未知数只包含一个字母。输入保证加减法运算次数之和不超过30次。

样 例

  输入:       6a-5+1=2-2a

   输出:

       a=0.750

题解:
这就是个模拟啊,把含未知数放左边,其余的丢右边,然后加起来相除就好了。

#include<cstdio>#include<cstring>char a[105];inline bool BIG(char C) {    if((C>='a'&&C<='z')||(C>='A'&&C<='Z'))return true;    return false;}int GetNumber(int st,int en) {    int sum=0;    for(int i=st; i<en; ++i) {        sum=sum*10+(a[i]-'0');    }    return sum;}int main() {    while(~scanf("%s",a)) {        char C;        int len=strlen(a);        int len1;        for(int i=0; i<len; ++i) {            if(BIG(a[i])) {                C=a[i];            }            if(a[i]=='=') {                len1=i;            }        }        double X=0,Y=0;        int f=0;        while(f<len) {            int BIGN=1;            if(a[f]=='-') {                BIGN=-1,++f;            }            if(a[f]=='+') {                ++f;            }            if(a[f]==C) {                if(f>=len1)X-=1.00;                else if(f<=len1)X+=1.00;                ++f;                continue;            }            if(a[f]=='=') {                ++f;                continue;            }            int J=0,pos=-1;            for(int i=f; i<len; ++i) {                if(BIG(a[i])) {                    J=1;                    pos=i;                    break;                }                if(a[i]=='-'||a[i]=='+'||a[i]=='=') {                    J=2;                    pos=i;                    break;                }            }            if(pos==-1) {                pos=len;            }            if(pos>=len1&&J==1) {                BIGN=-BIGN;            }            if(pos<=len1&&J!=1) {                BIGN=-BIGN;            }            if(J==1) {                X+=(BIGN*1.000*GetNumber(f,pos));                if(J==1)++pos;            } else  {                Y+=(BIGN*1.000*GetNumber(f,pos));            }            f=pos;            if(f>=len-1)break;        }        double Ans=Y/X;        if(Y==0.000){            Ans=0.00;        }        printf("%c=%.3f\n",C,Ans);    }    return 0;}
1 0
原创粉丝点击