一道华为的“简单四则运算”题解决办法
一道华为的“简单四则运算”题
刚好看见这个问题,本想着很简单,不就四则运算,且不用考虑除数为0,又是仅包含个位数0-9.后来一写,卡在那儿了,
中途还看了个电影。。。
写出这个算法前没有参照网上一些例子。后来查,看着列子都是挺长的。所以就拿出来和大家分享了。
如有不恰当的地方,请指针。。
【 问题描述】: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值注:
1、表达式只含 +, -, *, / 四则运算符,不含括号
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况•
要求实现函数: int calculate(int len,char *expStr)
【输入】 int len: 字符串长度;char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果
int calcucate(int len, char* expStr)
{
//算法思路:先乘除,后加减
assert(expStr != NULL);
len = strlen(expStr);//防止函数调用者粗心传错参数
int result = 0;
char* temp = new char[len];
char* temp2 = temp;
memset(temp,0,len);
//先做乘除运算
for (int i=0; i<len; i++)
{
if (*(expStr+i) != '*' && *(expStr+i) != '/')
{
*temp = *(expStr+i);
temp++;
}
else
{
if (*(expStr+i) == '*')
{
int a = (*(expStr+i-1) - 48);
int b = (*(expStr+i+1) - 48);
*temp= (*--temp - 48) * (*(expStr+i+1) - 48) + 48;
temp++;
i += 1;
}
else
if (*(expStr+i) == '/')
{
*temp = (*--temp - 48) / (*(expStr+i+1) - 48) + 48;
temp++;
i += 1;
}
}
}
//后做加减运算
for (int i=0; i<strlen(temp2); i++)
{
if (*(temp2+i)<='9' && * (temp2+i)>='0' )
{
result += *(temp2+i) - 48;
}
else
{
if (*(temp2+i) == '-')
{
result -= *(temp2+i+1) - 48;
i += 1;
}
else
{
result += *(temp2+i+1) - 48;
i += 1;
}
}
}
temp -= strlen(temp2);
delete []temp; //new 出来的内存,用完后请释放,且不要忘了执行上一语句,否则运行报错。
return result;
}
------解决方案--------------------
int game_body(char control,int read_time,bool had_user,char *cin_name,char *score_arr) //游戏的大函数体声明及定义。
{
while(1)
{
if(control == Start)
{
cout<<"系统给您派发的牌是:";
srand((int)time(NULL)); //利用休眠函数。延时,产生不同随机数种子。
for(int i=0; i<4; i++) //系统产生4个1—13之间的随机数的循环。
{
size_t p = rand()%14; //产生0-13之间的随机数。
if(p!=0) //随机数不为0将随机数赋给派牌数组。
{
choice[i]=p;
cout<<p<<" "; //显示系统所派发的四张牌。
}
if(p==0) //如果产生的随机数为0,系统迭代自减,将再次多生成一个。直到不为0。
{
i--;
}
}
stack <double> num1;
stack <char> ops;
ops.push('#');
string equation;
cout<<endl;
cout<<"请输入您的算法:";
fflush(stdin);
getline(cin,equation);
modify(equation);
while(!check(equation))
{
cout<<"您输入的算法不合法,请检查后重新输入一遍谢谢。 "<<endl;
cout<<"请重新输入您的算法:";
getline(cin,equation);
modify(equation);
刚好看见这个问题,本想着很简单,不就四则运算,且不用考虑除数为0,又是仅包含个位数0-9.后来一写,卡在那儿了,
中途还看了个电影。。。
写出这个算法前没有参照网上一些例子。后来查,看着列子都是挺长的。所以就拿出来和大家分享了。
如有不恰当的地方,请指针。。
【 问题描述】: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值注:
1、表达式只含 +, -, *, / 四则运算符,不含括号
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况•
要求实现函数: int calculate(int len,char *expStr)
【输入】 int len: 字符串长度;char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果
int calcucate(int len, char* expStr)
{
//算法思路:先乘除,后加减
assert(expStr != NULL);
len = strlen(expStr);//防止函数调用者粗心传错参数
int result = 0;
char* temp = new char[len];
char* temp2 = temp;
memset(temp,0,len);
//先做乘除运算
for (int i=0; i<len; i++)
{
if (*(expStr+i) != '*' && *(expStr+i) != '/')
{
*temp = *(expStr+i);
temp++;
}
else
{
if (*(expStr+i) == '*')
{
int a = (*(expStr+i-1) - 48);
int b = (*(expStr+i+1) - 48);
*temp= (*--temp - 48) * (*(expStr+i+1) - 48) + 48;
temp++;
i += 1;
}
else
if (*(expStr+i) == '/')
{
*temp = (*--temp - 48) / (*(expStr+i+1) - 48) + 48;
temp++;
i += 1;
}
}
}
//后做加减运算
for (int i=0; i<strlen(temp2); i++)
{
if (*(temp2+i)<='9' && * (temp2+i)>='0' )
{
result += *(temp2+i) - 48;
}
else
{
if (*(temp2+i) == '-')
{
result -= *(temp2+i+1) - 48;
i += 1;
}
else
{
result += *(temp2+i+1) - 48;
i += 1;
}
}
}
temp -= strlen(temp2);
delete []temp; //new 出来的内存,用完后请释放,且不要忘了执行上一语句,否则运行报错。
return result;
}
------解决方案--------------------
int game_body(char control,int read_time,bool had_user,char *cin_name,char *score_arr) //游戏的大函数体声明及定义。
{
while(1)
{
if(control == Start)
{
cout<<"系统给您派发的牌是:";
srand((int)time(NULL)); //利用休眠函数。延时,产生不同随机数种子。
for(int i=0; i<4; i++) //系统产生4个1—13之间的随机数的循环。
{
size_t p = rand()%14; //产生0-13之间的随机数。
if(p!=0) //随机数不为0将随机数赋给派牌数组。
{
choice[i]=p;
cout<<p<<" "; //显示系统所派发的四张牌。
}
if(p==0) //如果产生的随机数为0,系统迭代自减,将再次多生成一个。直到不为0。
{
i--;
}
}
stack <double> num1;
stack <char> ops;
ops.push('#');
string equation;
cout<<endl;
cout<<"请输入您的算法:";
fflush(stdin);
getline(cin,equation);
modify(equation);
while(!check(equation))
{
cout<<"您输入的算法不合法,请检查后重新输入一遍谢谢。 "<<endl;
cout<<"请重新输入您的算法:";
getline(cin,equation);
modify(equation);