2000年分区联赛普级组之一 计…

来源:互联网 发布:手机图章制作软件 编辑:程序博客网 时间:2024/04/27 17:40

Description

  NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例: 
   
  4+3x=8 
  6a-5+1=2-2a 
  -5+12y=0 

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

Input

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

Output

  方程的结果(精确至小数点后三位)。 

Sample Input

 

  6a-5+1=2-2a

 

Sample Output

 

  a=0.750


解题思路:先读入字符串,预处理,然后循环,用多个变量对该方程进行标记,然后根据标记进行计算,最后输出解出的结果即可。


程序:
var
  s1,s,st,str:string;
  k1,n,k2,k,z:int64;
  i,j,code:longint;
begin
  readln(s);
  for i:=1 to length(s) do
    if (s[i] in  ['a'..'z']) or (s[i] in ['A'..'Z']) then s1:=s[i];
  j:=1;k1:=0;k2:=0;code:=0;
  for i:=1 to pos('=',s) do
    begin
      if ((s[i]='+') or (s[i]='-') or (s[i]='=')) and(i<>1) then
        begin
          str:=copy(s,j,i-j);
          val(str,k,code);
          if code=0 then k2:=k2-k;
          if code<>0 then
            begin
              delete(str,code,1);
              if str='' then k:=1
                else val(str,k,code);
              if code<>0 then
                if str[1]='+' then k:=1
                  else
                    if str[1]='-'then k:=-1;
              k1:=k1+k;
            end;
         j:=i;
      end;
    end;
    code:=0;
    j:=pos('=',s)+1;
    for i:=pos('=',s)+1 to length(s) do
      begin
        if ((s[i]='+') or (s[i]='-') and(s[i-1]<>'=')) or (i=length(s)) then
          begin
            if i<>length(s) then str:=copy(s,j,i-j)
              else str:=copy(s,j,i-j+1);
            val(str,k,code);
            if code=0 then k2:=k2+k;
            if code<>0 then
              begin
                delete(str,code,1);
                if str='' then k:=1
                  else val(str,k,code);
                if code<>0 then
                  if str[1]='+' then k:=1
                    else if str[1]='-'then k:=-1;
               k1:=k1-k;
              end;
           j:=i;
       end;
     end;
  if k2/k1=0 then writeln(s1,'=','0.000')
    else writeln(s1,'=',k2/k1:0:3);
end.

版权属于: Chris

原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102v0yk.html

转载时必须以链接形式注明原始出处及本声明。

0 0
原创粉丝点击