我想计算(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");
}
答案 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,必须按照数学运算的顺序放置,否则结果方程将与输入字符串不匹配!!!如果你为解析器定义了不同的解析规则,那么在标准数学中你需要在问题中定义它们。
现在该如何解决这个问题:
读取字符串
我会从常量的硬编码字符串开始,而不是一遍又一遍地编写/调试(很多学生都这样做...)我看到很少有人在每个构建上键入5x5
矩阵: )... ......这是疯了)
当程序有效时,请使用cin
阅读...正如您已经做的那样
检测字符串的哪个部分是幂指数
exponent=1
^
并记住开始位置i0
,如果没有找到goto #4 。现在取决于以下内容:
exponent
。^
跳过它并转到#2 粗略如果你应该支持parentes那么它将会复杂得多,你需要解码整个事情,这不是一件小事,你也应该在问题中提到。
用计算字符串替换原始指数字符串(如果可计算)
所以计算出的字符串将是"^"<<exponent
或"^"+exponent
取决于你使用的字符串算术类型....
输出字符串
使用cout
或您已经做过的任何事情