北京理工大学计算机学院复试上机题目
由于编者水平有限,如有错误,请多多包涵。欢迎各位指正,转载请注明,谢谢合作!
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;
}