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

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

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

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

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


#include
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<<"输出:"<

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

排序输出. .

示例: :

输入:Information Info Inform info Suite suite suit

输出:Info info Inform Information suit Suite suite

#include
#include
#include
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]>voc[n++]);
	n--;

	sort(voc,voc+n,cmp);
	for(int i=0;i

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

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

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

#include
#include
#include
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 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])


你可能感兴趣的:(北理计算机复试)