先写了一个程序,没有考虑到12+3这样的情况, 所以错了,有bug的程序如下:
#include <iostream>
using namespace std;
int operation(int x, char c, int y)
{
if('+' == c)
return x + y;
if('-' == c)
return x - y;
if('*' == c)
return x * y;
if('/' == c)
return x / y;
}
int main()
{
char str[101];
int number[52];
char operatorStr[51];
int i;
int len;
int leftNumber, rightNumber;
char c;
while(cin >> str)
{
len = strlen(str);
for(i = 1; i <= len/2 + 1; i++)
{
number[i] = str[i * 2 - 2] - '0';
operatorStr[i] = str[i * 2 - 1];
}
leftNumber = number[1];
for(i = 1; i <= len/2; i++)
{
rightNumber = number[i + 1];
c = operatorStr[i];
if('/' == c && 0 == rightNumber)
{
break;
}
leftNumber = operation(leftNumber, c, rightNumber);
}
cout << leftNumber << endl;
}
return 0;
}
后来考虑到了12+3这样的情形,提交成功,程序如下:
#include <iostream>
using namespace std;
bool isOperator(char c)
{
if('+' == c || '-' == c || '*' == c || '/' == c)
return true;
return false;
}
/*
Split str into two arrays, namely number and operatorStr.
Note that the first interger here is number[1].
The first operator here is operatorStr[1].
For example, "12+3" results in number[1] = 12,
number[2] = 3, operatorStr[1] = '+'
*/
void save(char str[], int number[], char operatorStr[])
{
int i, j = 1, tmpNumber = 0;
for(i = 0; '\0' != str[i]; i++)
{
if(!isOperator(str[i]))
{
tmpNumber = 10 * tmpNumber + str[i] - '0';
number[j] = tmpNumber;
}
else
{
operatorStr[j++] = str[i];
tmpNumber = 0; // reset it to 0
}
}
number[j] = tmpNumber;
}
int operation(int x, char c, int y)
{
if('+' == c)
return x + y;
if('-' == c)
return x - y;
if('*' == c)
return x * y;
if('/' == c)
return x / y;
}
int main()
{
char str[101];
int number[52];
char operatorStr[51];
int i;
int lastIndex;
int leftNumber, rightNumber;
char c;
// definitely necessary
memset(number, 0, 52 * sizeof(int));
memset(operatorStr, 0, 51 * sizeof(char));
operatorStr[0] = 'a'; // for strlen
while(cin >> str)
{
save(str, number, operatorStr);
lastIndex = strlen(operatorStr) - 1;
leftNumber = number[1];
for(i = 1; i <= lastIndex; i++)
{
rightNumber = number[i + 1];
c = operatorStr[i];
if('/' == c && 0 == rightNumber)
{
break;
}
leftNumber = operation(leftNumber, c, rightNumber);
}
cout << leftNumber << endl;
}
return 0;
}