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

时间:2016-06-23 08:05:38

标签: c++ algorithm

我想计算(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] != '\0' && 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");

 }

2 个答案:

答案 0 :(得分:1)

这不是一个小问题。你想建立一个中缀计算器(a + b)。前缀计算器(+ a b)或后缀计算器(a b +)更简单,因为根本没有歧义。中缀计算器可以包含很多,具体取决于您希望用户拥有的自由度。

在你暴露的问题中,人们很想说:好吧,如果第二个操作数旁边有一个操作符,那么我必须累积最后一个结果并使用该操作和下一个操作。但是,存在诸如优先权之类的问题,这些问题将不会与该方法相关。

我会开始创建一个前缀计算器。这很容易:

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)

一旦掌握了这一点,就有可能从中缀计算器开始。

在最后一个算法中要做的一件事就是更改它以避免递归,例如。

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

答案 1 :(得分:0)

这有点像家庭作业/作业,所以我不会提供代码......

正如我所看到的那样,你只需要字符串解析器来替换功率部分。我假设您仍然不理解幂数学或者错误地编写/解释字符串的表示。例如:

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。你不能在你想要的地方添加parenteses,必须按照数学运算的顺序放置,否则结果方程将与输入字符串不匹配!!!如果你为解析器定义了不同的解析规则,那么在标准数学中你需要在问题中定义它们。

现在该如何解决这个问题:

  1. 读取字符串

    我会从常量的硬编码字符串开始,而不是一遍又一遍地编写/调试(很多学生都这样做...)我看到很少有人在每个构建上键入5x5矩阵: )... ......这是疯了)

    当程序有效时,请使用cin阅读...正如您已经做的那样

  2. 检测字符串的哪个部分是幂指数

    1. exponent=1
    2. 搜索字符串中的第一个^并记住开始位置i0,如果没有找到goto #4
    3. 现在取决于以下内容:

      • 如果数字乘以exponent
      • 如果^跳过它并转到#2
      • 如果双方都停止

      粗略如果你应该支持parentes那么它将会复杂得多,你需要解码整个事情,这不是一件小事,你也应该在问题中提到。

  3. 用计算字符串替换原始指数字符串(如果可计算)

    所以计算出的字符串将是"^"<<exponent"^"+exponent取决于你使用的字符串算术类型....

  4. 输出字符串

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