北理计算机学院2013年机试真题

北京理工大学计算机学院复试上机题目

  由于编者水平有限,如有错误,请多多包涵。欢迎各位指正,转载请注明,谢谢合作!

1.求两个数的最大公约数

示例: : 输入 :24,18 输出 :6


#include<iostream>
using namespace std;

/**
* 辗转相除法
*/
int gcd(int m,int n){
	int t=n;
	if(n>m){
		n=m;
		m=t;
	}
	while(n!=0){
		t=m%n;
		m=n;
		n=t;
	}
	return m;
}

int main()
{
	int x,y;
	cout<<"输入:";
	cin>>x>>y;
	cout<<"输出:"<<gcd(x,y)<<endl;
	return 0;
}

2.输入一组英文单词, , 按字典顺序( ( 大写与小写字母具有相同大小写) )

排序输出. .

示例: :

输入:Information Info Inform info Suite suite suit

输出:Info info Inform Information suit Suite suite

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

// 排序规则 
bool cmp(string x,string y){
	int t=0;
	while(x[t]!='\0'&&y[t]!='\0'){
		// 统一为小写进行比较
		if(x[t]>'Z')
			x[t]-=32;
		if(y[t]>'Z')
			y[t]-=32;
		// 比较当前字母大小
		if(x[t]!=y[t])
			return x[t]<y[t];
		// 当前位置相等,比较下一位
		t++;
	}
	if(y[t]!='\0')
		return true;
	return false;
}

int main()
{
	string voc[100];
	int n=0;
	while(cin>>voc[n++]);
	n--;

	sort(voc,voc+n,cmp);
	for(int i=0;i<n;i++)
		cout<<voc[i]<<" ";
	cout<<endl;

	return 0;
}

3.编写程序:输入表达式,输出相应二叉树的先序遍历结果

输入: a+b*(c-d)-e/f

输出: -+a*b-cd/ef

#include<iostream>
#include<string>
#include<stack>
using namespace std;

/**
* 问题转化
* 前缀表达式=前序遍历;
* 中缀表达式=中序遍历;
* 后缀表达式=后序遍历;
* 因此原问题可转化为求波兰式
*/

/**
* 求波兰式:(自己研究的方法,不知道是否主流)
* 建立两个栈,s1,s2;
* 从中缀表达式的右端开始检索,遇到非运算符直接压入栈s2;
* 遇到运算符,若栈s1为空,直接压栈s1;
* 若s1非空,比较当前运算符与栈顶运算符优先级,若栈顶运算符优先级高,s1弹栈,并立刻压入s2;若当前运算符优先级高,压入s1;
* 若已经检索完表达式,s1非空,则按顺序弹栈压入s2;
* s2弹栈即为所求。
*/

// 判断字符是否为运算符
bool isOp(char a){
	if(a=='('||a=='+'||a=='-'||a=='*'||a=='/'||a==')')
		return true;
	return false;
}

// 表达式中运算符的优先等级
int pe(char a){
	// 定义运算符的优先级分别为(、+、-、*、/、)
	int priority[6]={0,1,1,2,2,3};
	char op[6]={'(','+','-','*','/',')'};
	for(int i=0;i<6;i++){
		if(op[i]==a)
			return priority[i];
	}
}

// 栈顶运算符的优先等级
int ps(char a){
	// 定义运算符的优先级分别为(、+、-、*、/、)
	int priority[6]={0,1,1,2,2,0};
	char op[6]={'(','+','-','*','/',')'};
	for(int i=0;i<6;i++){
		if(op[i]==a)
			return priority[i];
	}
}

int main()
{
	stack<char> s1,s2;
	string exp;
	cin>>exp;
	// 从右向左搜索表达式
	for(int i=exp.length()-1;i>=0;i--){
		bool flag=true;
		// 左右括号匹配抵消的情况
		if(exp[i]=='('&&s1.top()==')'){
			s1.pop();
			continue;
		}
		// 非运算符直接压入s2
		if(!isOp(exp[i]))
			s2.push(exp[i]);
		else{
			// s1为空,直接压栈
			if(s1.empty())
				s1.push(exp[i]);
			// s1非空,比较当前运算符与栈顶运算符优先级
			else{
				// 当前运算符优先级高,压入s1
				if(pe(exp[i])>=ps(s1.top()))
					s1.push(exp[i]);
				// 栈顶运算符优先级高,s1弹栈,并立刻压入s2
				else{
					while(pe(exp[i])<ps(s1.top())){
						char t=s1.top();
						s2.push(t);
						s1.pop();
						// 防止栈空出错
						if(s1.empty())
							break;
						// 左右括号匹配抵消的情况
						if(exp[i]=='('&&s1.top()==')'){
							s1.pop();
							flag=false;
							break;
						}
					}
					if(flag)
						s1.push(exp[i]);
				}
			}

		} 
	}

	// 已经检索完表达式,s1非空,则按顺序弹栈压入s2
	while(!s1.empty()){
		char t=s1.top();
		s2.push(t);
		s1.pop();
	}

	// 输出结果
	while(!s2.empty()){
		cout<<s2.top();
		s2.pop();
	}
	cout<<endl;

	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值