zoukankan      html  css  js  c++  java
  • NOIP2000普及组 T1计算器的改良

    主要考字符串处理,把等式从等号中间断开,左边的区域为left,右边的区域为right。

    开四个数组分别用来存储区域left和right中未知数的系数,区域left和right中的常数

    先处理区域left,把区域left中含有未知数的数字和常数分别存储进数组,再处理区域right(字符串处理这里省略)

    最后把存储区域left和right的未知数系数和常数的数组分别化简(合并同类项),进行平时解方程时候的模拟就好了。

    主要看代码理解吧,思路讲的有点抽象了。

     1 var
     2         l_unk,r_unk,l_num,r_num:array[1..255] of longint;  //上面所说的四个数组
     3         top1 ,top2 ,top3 ,top4 :longint;  //四个数组的栈顶
     4         s,str:string;
     5         i,j:longint;
     6         unk:char;  //未知数的符号
     7         mid,last,value:longint;
     8 begin
     9         readln(s);
    10         for i:=1 to length(s) do  //处理区域left
    11         begin
    12                 if s[i] in ['a'..'z'] then unk:=s[i];  //找出未知数
    13                 if s[i]='=' then mid:=i;  //找出等式中间位置
    14         end;
    15         if s[length(s)]<>unk then
    16                 s:=s+'+';
    17         last:=1;
    18         for i:=1 to mid do
    19         begin
    20                 if s[i]=unk then  //如果遇到未知数
    21                 begin
    22                         str:=copy(s,last,i-last);  //字符串处理
    23                         val(str,value);  //字符串转数字
    24                         inc(top1);
    25                         l_unk[top1]:=value;  //进栈
    26                         last:=i+1;
    27                 end;
    28                 if (not(s[i] in ['0'..'9'])) and (s[i]<>unk) and (i<>last) then  //如果遇到了常数
    29                 begin
    30                         str:=copy(s,last,i-last);  //字符串处理
    31                         val(str,value);  //转数字
    32                         inc(top3);
    33                         l_num[top3]:=value;  //进栈
    34                         last:=i;
    35                 end;
    36         end;
    37         last:=mid+1;
    38         for i:=mid+1 to length(s) do  //处理区域right
    39         begin
    40                 if s[i]=unk then  //   同上
    41                 begin
    42                         str:=copy(s,last,i-last);
    43                         val(str,value);
    44                         inc(top2);
    45                         r_unk[top2]:=value;
    46                         last:=i+1;
    47                 end;
    48                 if (not(s[i] in ['0'..'9'])) and (s[i]<>unk) and (i<>last) then
    49                 begin
    50                         str:=copy(s,last,i-last);
    51                         val(str,value);
    52                         inc(top4);
    53                         r_num[top4]:=value;
    54                         last:=i;
    55                 end;
    56         end;
    57         for i:=top1-1 downto 1 do l_unk[i]:=l_unk[i]+l_unk[i+1];  //化简数组,合并同类项
    58         for i:=top2-1 downto 1 do r_unk[i]:=r_unk[i]+r_unk[i+1];
    59         for i:=top3-1 downto 1 do l_num[i]:=l_num[i]+l_num[i+1];
    60         for i:=top4-1 downto 1 do r_num[i]:=r_num[i]+r_num[i+1];
    61         l_unk[1]:=l_unk[1]-r_unk[1];  //解方程,左边未知数系数加上右边未知数的系数的相反数
    62         r_num[1]:=r_num[1]-l_num[1];  //解方程,右边常数加上左边常数的相反数
    63         writeln(unk,'=',r_num[1]/l_unk[1]:0:3);   //输出保留3位小数
    64 end.
  • 相关阅读:
    不同品牌交换机设置telnet方法
    Oracle 11G RAC For Windows 2008 R2部署手册(亲测,成功实施多次)
    oracle 11g ADG实施手册(亲测,已成功部署多次)
    如何正确的使用uwsgi
    debian小巧好看的桌面
    zsh中home键失灵问题
    C#_Markov_心得感想
    NLP—WordNet——词与词之间的最小距离
    这不算爬虫吧?!
    Table-Driven Design 表驱动设计
  • 原文地址:https://www.cnblogs.com/SJum/p/7376578.html
Copyright © 2011-2022 走看看