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.
  • 相关阅读:
    37. Sudoku Solver(js)
    36. Valid Sudoku(js)
    35. Search Insert Position(js)
    34. Find First and Last Position of Element in Sorted Array(js)
    33. Search in Rotated Sorted Array(js)
    32. Longest Valid Parentheses(js)
    函数的柯里化
    俞敏洪:我和马云就差了8个字
    vue路由传值params和query的区别
    简述vuex的数据传递流程
  • 原文地址:https://www.cnblogs.com/SJum/p/7376578.html
Copyright © 2011-2022 走看看