一道ACM省赛题,Codeblocks测试的所有我能想到的数据都通过了,可是提交去是wrongAnswer
我的代码如下,请高手帮看看,到底还有什么没有考虑到!
#include <iostream>
using namespace std;
bool isEqual(int f, char op, int s, int r, bool bPos);
int getResult(const string &expresion, int n);
int getFirst(const string &expresion, int n);
int getSecond(const string &expresion, int n, int sBegin);
int main()
{
string expresion;//接收表达式
int f, //操作数1
s, //操作数2
r; //计算结果
char op; //执行的操作类型 + 或者 -
bool bPos = false; //计算结果是否为负
int len;
int rightNum = 0;
int i, nCount;
while (cin >> expresion)
{
len = expresion.size();
if (expresion[len-1] == '?')
continue;
//*********************************处理操作数1***********************************
i = 0;
nCount = 0;
while (expresion[i] >= '0' && expresion[i] <= '9')
{
nCount++;
i++;
}
f = getFirst(expresion, nCount);
//*********************************处理执行的操作 +或者-*************************
op = expresion[i];
//*********************************处理操作数2***********************************
i = nCount+1;
int sBegin = nCount+1; //操作数2的起始
nCount = 0;
while (expresion[i] >= '0' && expresion[i] <= '9')
{
nCount++;
i++;
}
s = getSecond(expresion, nCount, sBegin);
//*********************************处理计算结果***********************************
i = len-1;
nCount = 0;
while (expresion[i] >= '0' && expresion[i] <= '9')//找到计算结果的位数,并判断正负
{
i --;
nCount ++;
}
if (expresion[i] == '-') //如果结果为负
{
bPos = true;
//cout << "结果为负" << endl;
}
else
{
bPos = false;
//cout << "结果为正" << endl;
}
r = getResult(expresion, nCount);
//*******************判断表达式是否正确*************************************
if (isEqual(f, op, s, r, bPos))
{
rightNum++;
// cout << "计算正确的哦!" << "rightNum = " << rightNum << endl;
}
//else
// cout << "计算错误的哦!" << "rightNum = " << rightNum << endl;
}
cout << rightNum << endl;
return 0;
}
//********************************************************************************
bool isEqual(int f, char op, int s, int r, bool bPos)
{
int tmp, t;
//cout << "expresion: " << f << op << s << "=" << (bPos?"-":"")<< r << endl;;
switch (op)
{
case '+':
tmp = t = f + s;
// cout << "tmp=" << tmp << endl;
if (tmp == r && !bPos)
return true;
return false;
case '-':
tmp = t = f - s;
//cout << "tmp=" << tmp << endl;
tmp = tmp > 0 ? tmp : (-tmp);//求绝对值
if (tmp == r)
if ((bPos && t <= 0) || (!bPos && t >= 0))
return true;
else
return false;
return false;
}
}
//*********************************************************************************************
int getResult(const string &expresion, int n)
{
int len = expresion.size();
int r;
switch (n)
{
case 1:
r = expresion[len-1] - '0';
break;
case 2:
r = (expresion[len-2] - '0') * 10 + (expresion[len-1] - '0');
break;
case 3:
r = (expresion[len-3] - '0') * 100 + (expresion[len-2] - '0') * 10 + (expresion[len-1] - '0');
break;
}
//cout << "r=" << r << endl;
return r;
}
//*********************************************************************************************
int getFirst(const string &expresion, int n)
{
int f;
switch (n)
{
case 1:
f = expresion[0] - '0';
break;
case 2:
f = (expresion[0] - '0') * 10 + (expresion[1] - '0');
break;
}
//cout << "f=" << f << endl;
return f;
}
//*********************************************************************************************
int getSecond(const string &expresion, int n, int sBegin)
{
int s;
switch (n)
{
case 1:
s = expresion[sBegin] - '0';
break;
case 2:
s = (expresion[sBegin] - '0') * 10 + (expresion[sBegin+1] - '0');
break;
}
//cout << "s=" << s << endl;
return s;
}
//*********************************************************************************************
[解决办法]
3+3
expresion: 3+3=3
2-1
expresion: 2-1=-1
9+6
expresion: 9+6=6