如何计算多项式(x^2^2^2^2 x^2^2^2)

how to calculate polynomial (x^2^2^2^2+x^2^2^2)

本文关键字:多项式 计算 何计算      更新时间:2023-10-16

我想计算(x^2^2^2^2 x^2^2^2)结果应该为[x^256 x^16] ..但是我我无法完全做到这一点。我还编写了一个在上半场工作的代码(在' '之前),但在其他一半之前,它无法做到...

#include<iostream>
    #include<string>
    #include <algorithm>
    #include<sstream>
  using namespace std;
  int main()
 {
string a;
cin >> a;
string s1 = "^";
string::size_type foud;
foud = a.find(s1);
int i = foud;
int flag = 0;
i++;
while (foud != std::string::npos)
{
    flag = 0;
    cout << i <<"I"<< endl;
    while (flag != 1 && i < a.length())
    {
        if (a[i] == '(' || a[i] == '+' || a[i] == '-' || a[i] == ')')
        {
            flag++;
            cout << "terminator" << endl;
        }

        else if (a[i] == '^')
        {
            /*int j = (int)(a[i - 1]);
            j = j - 48;
            int k = (int)(a[i + 1]);
            k = k - 48;
            i = k + 1;
            int power =0;
            power = pow(j, k);
            ;*/
            int j = i;
            int k = i;
            k--;
            j++;
            string bcknumber;
            while (a[k] != '^' && a[k] != '(' && a[k] != '+' && a[k] != '-' && a[k] != ')')
            {
                bcknumber = bcknumber + a[k];
                k--;
            }
            cout << bcknumber << endl;
            reverse(bcknumber.begin(), bcknumber.end());
            cout << bcknumber << endl;
            int BK;
            BK = stoi(bcknumber);
            int FD;
            string frdnum;
            while (a[j] != '^'&&a[j] != '' && a[j] != '(' && a[j] != '+' && a[j] != '-' && a[j] != ')')
            {
                frdnum = frdnum + a[j];
                j++;
            }
            FD = stoi(frdnum);
            int resil = pow(BK, FD);
            frdnum.clear();
            stringstream s;
            string res;
            s << resil;
            res = s.str();
            if (i == 15)
            {
                a.replace(14, 15, res);
            }
            else
            {
                a.replace(i - bcknumber.length(), i + frdnum.length(), res);
            }
            i--;
            bcknumber.clear();

        }
        else
            i++;
    }
    foud = a.find("^", foud + 1);
    i = foud;
    i++;

}
cout << a << endl;
system("pause");
 }

这不是一个微不足道的问题。您想构建一个Infix计算器(A B)。前缀计算器( A B)或后缀计算器(A B )更简单,因为根本没有歧义。infix计算器可以具有很多,具体取决于您希望用户拥有的自由度。

在您暴露的问题中,人们很想说:嗯,如果第二个操作数旁边有一个操作员,那么我必须累积最后的结果并使用该操作以及下一个操作。但是,有一些问题之类的问题不会用这种方法来处理。

我将开始创建一个前缀计算器。这要容易得多:

calculate():
   opr = match operator
   op1 = match operand
   if op1 is operator:
       back
       op1 = calculate
   op2 = match operand
   if op2 is operator:
       back
       op2 = calculate
   return calc(opr, op1, op2)

一旦您掌握了它,就有可能从infix计算器开始。

在最后一个算法中要做的一件事是将其更改以避免递归。

这是一个很好的锻炼,享受它。希望这会有所帮助。

这闻起来像作业/作业,所以我不会提供代码...

正如我所看到的那样,您只需字符串解析器即可替换电源零件。我假设您仍然不了解功率数学或错误地编写/解释字符串的表示形式。例如:

x^2^2^2^2 =
(((x^2)^2)^2)^2 =
(((x.x)^2)^2)^2 =
((x.x).(x.x))^2)^2 =
((x.x.x.x))^2)^2 =
((x.x.x.x).(x.x.x.x))^2 =
(x.x.x.x.x.x.x.x)^2 =
(x.x.x.x.x.x.x.x).(x.x.x.x.x.x.x.x) =
(x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x) =
x^16

而不是您的x^256。您无法添加必须根据数学操作的顺序放置它们的parentses,否则将导致的方程式与输入字符串匹配!!!如果您为解析器定义了不同的解析规则,则在标准数学中,您需要在问题中定义它们。

现在如何处理:

  1. 阅读字符串

    我将从恒定的硬编码字符串开始,而不是一遍又一遍地编程/debugin时一直键入它(就像许多学生一样...我看到每个构建中键入5x5矩阵的人几次这是疯狂的)

    只有程序工作时,只需使用cin读数...就像您已经做过的

  2. 检测字符串的哪一部分是电源指数

    1. exponent=1
    2. 搜索字符串查看第一个^,请记住起始位置i0如果找不到goto #4
    3. 现在取决于以下内容:

      • 如果数字乘以exponent
      • 如果^跳过它,然后将其转到#2
      • 如果都不停止

      粗糙的

      如果您应该支持父母,那么它将要复杂得多,您需要解码整个事情,这不是微不足道的,您也应该在问题中提及。

  3. 用计算字符串(如果可计算)

    替换原始指数字符串

    因此,计算的字符串将为"^"<<exponent"^"+exponent取决于您使用的字符串算术类型..

  4. 输出字符串

    使用cout或您已经做的任何事情