首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一路华为的“简单四则运算”题

2012-09-24 
一道华为的“简单四则运算”题刚好看见这个问题,本想着很简单,不就四则运算,且不用考虑除数为0,又是仅包含个

一道华为的“简单四则运算”题
刚好看见这个问题,本想着很简单,不就四则运算,且不用考虑除数为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);
}

cout<<equation<<" = ";
equation=equation+'#';
Calculate(num1,ops,equation);
cout<<num1.top()<<endl;

if(num1.top()==24)//如果输入算式的结果等于24。

plus_score++;

cout<<"********************** 恭喜您,你的答案正确!!!加 1 分!*********************"<<endl;
cout<<endl;
cout<<"*********************** 输入“C”继续游戏,“E”退出游戏 **********************"<<endl;
cin>>control;//输入控制字符,输入字符E退出游戏,输入字符C继续游戏。


if(control=='E')//输入字符E退出游戏
{
return exit(cin_name,plus_score,score_arr,had_user,read_time);//调用突出函数。


}

if(control=='C')
{
control='S';
continue;
}
}//结果正确的判断语句if结束。

else//结果不正确
{
cout<<"***********************对不起,您的答案不正确请继续努力!!!********************"<<endl;
cout<<endl;
}

}//判断结果等于24的语句结束。

cout<<"*********************** 输入Y查看正确答案,C继续下一题(Y/C)_";
cin>>checkanswer;
cout<<endl;
cout<<endl;

if(checkanswer==Continue_game)//输入C继续游戏。
{
control=Start;
continue;
}

if(checkanswer == Yes)//输入Y查看正确答案。
{

for(;;)
{

for(b=0; b<=2; b++)

for(a=3; a>=1+b; a--)
{
if(choice[a]<choice[a-1])
{
t=choice[a-1];
choice[a-1]=choice[a];
choice[a]=t;
}
}

for(int j=0; j<4; j++)
{
cout<<j+1<<"."<<choice[j]<<" ";
cout<<"\n";
}

for(i1=0;i1<4;i1++)
{
t1=choice[i1];

for(i2=0;i2<4;i2++){ if((i1-1)!=0 && t1==choice[i1-1])
{
break;
}

if(i2!=i1)
{
t2=choice[i2];
s1[0]=t1+t2;
s1[1]=t1-t2;
s1[2]=t1*t2;
s1[3]=t1/t2;

for(i3=0;i3<4;i3++)

if(i3!=i1&&i3!=i2)
{
t3=choice[i3];

for(v=0;v<4;v++)
{
s2[v][0]=s1[v]+t3;
s2[v][1]=s1[v]-t3;
s2[v][2]=s1[v]*t3;
s2[v][3]=s1[v]/t3;
}
for(i4=0;i4<4;i4++)
{
if(i4!=i1&&i4!=i2&&i4!=i3)
{
t4=choice[i4];

for(n1=0;n1<4;n1++)

for(n2=0;n2<4;n2++)

if(s2[n1][n2]+t4==24||s2[n1][n2]-t4==24||s2[n1][n2]*t4==24||s2[n1][n2]/t4==24)
{
cout<<"找到一种组合方案:\n(("<<t1;

if(s1[n1]==t1+t2)cout<<" + ";
if(s1[n1]==t1-t2)cout<<" - ";
if(s1[n1]==t1*t2)cout<<" * ";
if(s1[n1]==t1/t2)cout<<" / ";

if(n2==0)cout<<t2<<") + "<<t3;
if(n2==1)cout<<t2<<") - "<<t3;
if(n2==2)cout<<t2<<") * "<<t3;
if(n2==3)cout<<t2<<") / "<<t3;

if(s2[n1][n2]+t4==24)cout<<") + "<<t4<<" = 24 \n";
if(s2[n1][n2]-t4==24)cout<<") - "<<t4<<" = 24 \n";
if(s2[n1][n2]*t4==24)cout<<") * "<<t4<<" = 24 \n";
if(s2[n1][n2]/t4==24)cout<<") / "<<t4<<" = 24 \n";
num++;
}
}
}
}
}
}
}
}

cout<<"总共有"<<num<<"种解法。\n";
if(num!=0)
{
break;//查看答案有解跳出。
}

if(num==0)cout<<"这四张牌无法构成24点~~~\n";
{
num=0;//查看答案无解跳出。
break;
}
}

cout<<"*********************** 输入“C”继续游戏,“E”退出游戏 **********************"<<endl;

cin>>control;//输入控制语句。
if(control == Exit)
{
return exit(cin_name,plus_score,score_arr,had_user,read_time);//调用退出函数,做退出游戏的工作。
}


if(control == Continue_game)
{
control = Start;
continue;
}

}//输入Y查看正确答案结束。
}

} //游戏函数体结束。


这是我以前做24点游戏中的算法。。 希望对楼主有用。

热点排行