//从游标当前位置开始构造一个B类结点 private bool ConstructMultinomialB(out MultinomialB out1) { out1 = null; try { out1 = new MultinomialB(1); } catch (Exception) { Error = "内存空间不足"; return false; } while (Seek < Fm.Length) { if (Fm[Seek] != '^' && IsOperator(Fm[Seek]) || Fm[Seek] == '(') break; else if (IsLetter(Fm[Seek])) { MultinomialA a; try { a = new MultinomialA(Fm[Seek++]); } catch (Exception) { Error = "内存空间不足"; return false; } if (Seek < Fm.Length && Fm[Seek] == '^') { Double d; if (!Degree(out d)) return false; a.index = d; } out1.Insert(a); } else if (IsESC(Fm[Seek])) Seek++; else { if (IsNumber(Fm[Seek])) Error = "字母后面不能直接跟数字"; else Error = "存在非法字符:\"" + Fm[Seek] + "\""; return false; } } return true; }
//插入一个B类结点(实为多项式的加法运算) public void Insert(MultinomialB a) { if (a.IsZero()) return; int n = 0; while (n < count) { if (MultinomialB.Compare(a, Buf[n]) <= 0) break; n++; } if (n < count && MultinomialB.Compare(a, Buf[n]) == 0) { Buf[n].coefficient += a.coefficient; if (Buf[n].coefficient == 0) Remove(n); } else { if (count >= M) Enlarge(); if (n < count) { for (int i = count; i > n; i--) Buf[i] = Buf[i - 1]; } try { Buf[n] = new MultinomialB(a); } catch (Exception) { throw; } count++; } }
//构造函数 public MultinomialC(MultinomialB a) { M = BM; try { Buf = new MultinomialB[M]; } catch (Exception) { throw; } Insert(a); }
//复制构造函数 public MultinomialC(MultinomialC a) { BM = a.BM; M = a.M; count = a.count; try { Buf = new MultinomialB[M]; for (int i = 0; i < count; i++) Buf[i] = new MultinomialB(a.Buf[i]); } catch (Exception) { throw; } }
//B类结点的乘法运算 public static MultinomialB MUL(MultinomialB a, MultinomialB b) { try { if (a.coefficient == 0 || b.coefficient == 0) return new MultinomialB(0); } catch (Exception) { throw; } MultinomialB c; try { c = new MultinomialB(a); } catch (Exception) { throw; } c.coefficient *= b.coefficient; for (int i = 0; i < b.count; i++) c.Insert(b.Buf[i]); return c; }
//比较两个B类结点的大小(系数部分不算) public static int Compare(MultinomialB a, MultinomialB b) { int i = 0, n; while (i < a.count && i < b.count) { n = MultinomialA.Compare(a.Buf[i], b.Buf[i]); if (n != 0) return n; i++; } return a.count - b.count; }