NOIP2000计算器的改良

题目描述

NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:
 
   4+3x=8
   6a-5+1=2-2a
  -5+12y=0
 
ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“─”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
      
编写程序,解输入的一元一次方程, 将解方程的结果(精确至小数点后三位)输出至屏幕。
 

    你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。

输入

输入如题义所述的一个一元一次方程。

输出

输出只有一个实数,为方程的解。

样例输入

6a-5+1=2-2a

样例输出

a=0.750
这道题是暑假做的第一道NOIP,应该说很快就把大部分搞好,但是由于不细致或者没想到,我改了好多个小时,忘了读数
这道题只要用纯模拟就OK了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
char a[101],c='2';
int main(){
float n,wzsz=0.0,qz=0.0;
int j=0;
scanf("%s",&a);
int len,blen;
len=strlen(a);
for(int i=0;i<len;i++){
if(a[i]=='=')blen=i;
if((c=='2')&&(a[i]!='+'&&a[i]!='-'&&a[i]!='='&&!(a[i]>='0'&&a[i]<='9')))c=a[i];
}
for(int i=0;i<len;i++){
n=0.0;
j=0;
while(a[i]>='0'&&a[i]<='9'){n=n*10+a[i]-'0';++i;j++;}
if(a[i]==c){
if((a[i-j-1]=='+'||i-j-1<0)&&i-j-1<blen)wzsz+=n;
if((a[i-j-1]=='+'||i-j-1<0||a[i-j-1]=='=')&&i-j-1>=blen)wzsz-=n;
if((a[i-j-1]=='-')&&i-j-1<blen)wzsz-=n;
if((a[i-j-1]=='-')&&i-j-1>blen)wzsz+=n;
}else{
if((a[i-j-1]=='+'||i-j-1<0)&&i-j-1<blen)qz-=n;
if((a[i-j-1]=='+'||i-j-1<0||a[i-j-1]=='=')&&i-1>=blen)qz+=n;
if((a[i-j-1]=='-')&&i-j-1<blen)qz+=n;
if((a[i-j-1]=='-')&&i-j-1>blen)qz-=n;
}
}
float sz=qz/wzsz;
// cout<<wzsz<<endl<<qz;
printf("%c=%.3f",c,sz);
return 0;
}



原文地址:https://www.cnblogs.com/linzeli/p/7260409.html