您的位置:首页 > 其它

2014华为校招 重邮机试 2013.9.14 第一场

2014-08-19 15:52 204 查看
题目来源:http://download.csdn.net/detail/zhou20071801/6276543

 

第一题:



第二题:



 

第三题:



 

总结:第1题水题,第2题典型约瑟夫环问题,第三题标准解法应该是使用 数据结构教材上讲的 栈 + 后缀表达式。

这里给出第三题自己的一种拙劣解法,如有问题望大家不吝指正,代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<list>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>

using namespace std;
typedef enum{
status_L_operand,
status_R_operand,
status_operator,
}STATUS;

typedef enum{
LEVEL_LOW,
LEVEL_HIGH,
}LEVEL;

stack<int>  sOperand;
stack<char> sOperator;

void calcOnce(void){
int num_r = sOperand.top();
sOperand.pop();
int num_l = sOperand.top();
sOperand.pop();
char operation = sOperator.top();
sOperator.pop();
int result=0;
switch(operation){
case '+':
result = num_l + num_r;
break;
case '-':
result = num_l - num_r;
break;
case '*':
result = num_l * num_r;
break;
case '/':
if(num_r==0)
break;
result = num_l / num_r;
break;
}
sOperand.push(result);
}

int main(){

#ifndef ONLINE_JUDGE
freopen("testCase-3.txt","r",stdin);
#endif
char buffer[2048];

while(scanf("%s",buffer)!=EOF){
int len= strlen(buffer);
int i=0;
STATUS status = status_L_operand;
LEVEL level = LEVEL_LOW; //
int num=0;
while(i<len){
num = 0;
switch(status){
case status_L_operand:
while(buffer[i]>='0'&&buffer[i]<='9'){
num = num*10+(buffer[i] - '0');
i++;
}
sOperand.push(num);
status= status_operator;
break;
case status_operator:
switch(buffer[i]){
case '+':
case '-':
level = LEVEL_LOW;
sOperator.push(buffer[i]);
break;
case '*':
case '/':
level = LEVEL_HIGH;
sOperator.push(buffer[i]);
break;
}
status = status_R_operand;
i++;
break;
case status_R_operand:
while(buffer[i]>='0'&&buffer[i]<='9'){
num = num*10+(buffer[i] - '0');
i++;
}
sOperand.push(num);
//status= status_operator;
if(level == LEVEL_HIGH){
if((buffer[i]!='*'&&buffer[i]!='/')){
while(sOperator.size())
calcOnce();
}
else
calcOnce();
}
else if((level == LEVEL_LOW)&&( buffer[i]!='*'&&buffer[i]!='/')){
calcOnce();
}
status = status_operator;
break;

}
}
int result = sOperand.top();
sOperand.pop();
printf("%d\n",result);
}
fclose(stdin);
return 0;
}


 

测试用例:

3-2+15*2

3-2+2*3*4/8

2*3+10-5*2

1+2+3*4+5-6/6+7*8

测试输出:

31

4

6

75

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为机试题目