机试题.docx
《机试题.docx》由会员分享,可在线阅读,更多相关《机试题.docx(13页珍藏版)》请在冰豆网上搜索。
机试题
Description
比较奇偶数的个数。
Input
第一行是一个正整数n,表示一共有n个数。
第二行为n个整数。
Output
n个整数中奇数多则输出YES,否则输出NO。
SampleInput
5
12345
SampleOutput
YES
题B
Description
在平面上的n个点中找出横坐标最小的点。
Input
第一行是一个正整数n(1<=n<=1000),表示一共有n个点。
接下来n行,每行2个整数,分别表示每个点的横坐标和纵坐标。
Output
输出横坐标最小的那个点的横坐标和纵坐标,如果横坐标最小的点有多个,则只输出其中纵坐标最小的那个点。
SampleInput
5
52
23
24
32
41
SampleOutput
23
题C
Description
子矩阵旋转操作。
Input
前5行每行5个整数,表示一个5*5阶的矩阵。
第6行为4个整数abcd,根据这4个整数进行相应的旋转操作。
Output
若ab分别为12,则将原矩阵中以第c行第d列元素为左上角的2*2阶子矩阵顺时钟旋转90度后输出原矩阵。
若ab分别为13,则将原矩阵中以第c行第d列元素为左上角的3*3阶子矩阵顺时钟旋转90度后输出原矩阵。
若ab分别为22,则将原矩阵中以第c行第d列元素为左上角的2*2阶子矩阵逆时钟旋转90度后输出原矩阵。
若ab分别为23,则将原矩阵中以第c行第d列元素为左上角的3*3阶子矩阵顺时钟旋转90度后输出原矩阵。
SampleInput
12345
678910
1112131415
1617181920
2122232425
1311
SampleOutput
116145
1272910
13831415
1617181920
2122232425
题D
Description
赫夫曼编码
给出n个有权值的结点,构造赫夫曼树,输出所有这n个结点的权值与其赫曼编码长度(即该结点在所构造的赫曼树中的深度)的乘积的总和。
Input
第一行是一个正整数n,表示一共有n个结点。
第二行为n个整数,分别表示这n个结点的权值。
Output
输出所有这n个结点的权值与其赫曼编码长度的乘积的总和。
SampleInput
5
12259
SampleOutput
37
PS:
北邮计算机学院的复试上机测试是2个小时4道题,前3题稍简单,最后一道有点难度。
但今年最后关于赫夫曼编码的那道题与09年的最后一道基本相同,复试前如果练过09年的上机题的话基本做今年的这道题应该没有问题,据说09年4道全AC的全院只有4个,今年又几乎原封不动的考了这道题,4道全AC的全院有30个左右。
个人感觉北邮复试机试和面试比较重要,听力和专业课笔试基本上是走过场,专业课复试前也就看了半天编译原理(实在看不下去),基本是裸考。
以下是上面4道题的C++代码,都能AC。
代码除了注释外都是复试时候写的(题D为了在VC上也能编译,稍微改动了一下),由于时间关系,考试时并没有考虑效率问题,只是想尽快AC就行,所以这些代码并不一定是效率最好的,应该还有不少改进的余地。
=================================
题A
#include
usingnamespacestd;
intmain()
{
inteven=0,odd=0;
intn;
cin>>n;
intnum;
for(inti=0;i cin>>num;
if(num%2)
odd++;
else
even++;
}
if(odd>even)
cout<<"YES\n";
else
cout<<"NO\n";
return0;
}
=================================
题B
#include
#include
#include
usingnamespacestd;
structnode{
intx;
inty;
};
boolcmpx(node*a,node*b){
returna->xx;
}
boolcmpy(node*a,node*b){
returna->yy;
}
intmain()
{
intn;
cin>>n;
vectornvec;
for(inti=0;i node*nd=newnode;
cin>>nd->x>>nd->y;
nvec.push_back(nd);
}
sort(nvec.begin(),nvec.end(),cmpy);
stable_sort(nvec.begin(),nvec.end(),cmpx);
cout<x<<""<y< return0;
}
=================================
题C
#include
usingnamespacestd;
intmain()
{
intalt[5][5];
intcmdx,cmdy,x,y;
for(inti=0;i<5;i++)
for(intj=0;j<5;j++)
cin>>alt[i][j];
cin>>cmdx>>cmdy>>x>>y;
if(cmdx==2)
if(cmdy==2){
int*arr=newint[4];
arr[0]=alt[x-1][y-1];
arr[1]=alt[x-1][y];
arr[2]=alt[x][y-1];
arr[3]=alt[x][y];
alt[x-1][y-1]=arr[1];
alt[x-1][y]=arr[3];
alt[x][y-1]=arr[0];
alt[x][y]=arr[2];
}
else{
int*arr=newint[9];
arr[0]=alt[x-1][y-1];
arr[1]=alt[x-1][y];
arr[2]=alt[x-1][y+1];
arr[3]=alt[x][y-1];
arr[4]=alt[x][y];
arr[5]=alt[x][y+1];
arr[6]=alt[x+1][y-1];
arr[7]=alt[x+1][y];
arr[8]=alt[x+1][y+1];
alt[x-1][y-1]=arr[2];
alt[x-1][y]=arr[5];
alt[x-1][y+1]=arr[8];
alt[x][y-1]=arr[1];
alt[x][y]=arr[4];
alt[x][y+1]=arr[7];
alt[x+1][y-1]=arr[0];
alt[x+1][y]=arr[3];
alt[x+1][y+1]=arr[6];
}
else
if(cmdy==2){
int*arr=newint[4];
arr[0]=alt[x-1][y-1];
arr[1]=alt[x-1][y];
arr[2]=alt[x][y-1];
arr[3]=alt[x][y];
alt[x-1][y-1]=arr[2];
alt[x-1][y]=arr[0];
alt[x][y-1]=arr[3];
alt[x][y]=arr[1];
}
else{
int*arr=newint[9];
arr[0]=alt[x-1][y-1];
arr[1]=alt[x-1][y];
arr[2]=alt[x-1][y+1];
arr[3]=alt[x][y-1];
arr[4]=alt[x][y];
arr[5]=alt[x][y+1];
arr[6]=alt[x+1][y-1];
arr[7]=alt[x+1][y];
arr[8]=alt[x+1][y+1];
alt[x-1][y-1]=arr[6];
alt[x-1][y]=arr[3];
alt[x-1][y+1]=arr[0];
alt[x][y-1]=arr[7];
alt[x][y]=arr[4];
alt[x][y+1]=arr[1];
alt[x+1][y-1]=arr[8];
alt[x+1][y]=arr[5];
alt[x+1][y+1]=arr[2];
}
for(intii=0;ii<5;ii++){
for(intjj=0;jj<4;jj++)
cout< cout< }
return0;
}
=================================
题D
#include
#include
#include
usingnamespacestd;
intlen=0;
structnode{
intvalue;
intdepth;
node*left;
node*right;
booloperator<(node&a){returnvalue};
voidcalculate(node*n){
if(n!
=0){
n->depth=len;
len++;
calculate(n->left);
calculate(n->right);
len--;
}
}
voidgetSum(node*n,int&s){
if(n!
=0){
if(n->left==0&&n->right==0)
s+=(n->depth)*(n->value);
if(n->left!
=0)
getSum(n->left,s);
if(n->right!
=0)
getSum(n->right,s);
}
}
intmain()
{
intn;
intsum=0;
cin>>n;
listnlist;
for(inti=0;i node*nd=newnode;
cin>>nd->value;
nd->left=nd->right=0;
nlist.push_back(nd);
}
nlist.sort();
node*root;
while(nlist.size()>1){
node*nd1=nlist.front();
nlist.pop_front();
node*nd2=nlist.front();
nlist.pop_front();
node*nd=newnode;
nd->value=nd1->value+nd2->value;
nd->left=nd1;
nd->right=nd2;
list:
:
iteratorit;
for(it=nlist.begin();it!
=nlist.end();it++)
if((*it)->value>nd->value)
break;
nlist.insert(it,nd);
}
root=nlist.front();
calculate(root);//遍历一次赫夫曼树,计算出每个叶子结点的深度
getSum(root,sum);//又遍历了一次赫夫曼树,计算出所求总和,实际上应该只需遍历一次即可
cout< return0;
}
为了您的安全,请只打开来源可靠的网址
打开网站 取消
来自:
找出满足下列性质的三位数,输出并统计其个数:
能被11整除,且三个数位上没有两个数相同。
例:
121不可以。
4. 写一段满足下列条件的程序:
输入一个数n和m,把低m位移到高位并输出。
例:
123456789 3,回车后输出789123456.(不允许用数组实现)
5. 编写程序,输入n(n>=5),打印一个以n为参数的钻石形。
(他给出了一个图形,图形元素为星号,我不懂什么叫钻石形,也没从图中总结出规律,没做。
至于钻石形,读者自查吧)
6. 用数值迭代法求一个正数的开方,此数由键盘输入,满足前后两次结果数之差小于0.00001。
(他给出了迭代公式,我现在的机器不好写,读者自查吧)
7. 从键盘输入一组数,存入一链表中,以-1为链表结束的标志,且-1不作为链表节点。
并对其排序,按升序(注:
也可能是降序)输出。
8. 对给定的一个数组:
a[]={1,35,63,26,85,23,67,81,15,38,80,200},使用系统给定的二分查找函数bsearch()(注:
可能是这样写的,不确定)将其排序并输出。
此函数要查看系统联机文档,查看其用法。
以上试题不保证没有错漏,毕竟是回忆版的,但大致意思是对的。
上机环境为vc或tc可选,本人选的vc,感觉还是vc较好吧,tc毕竟“老古董”了。
下面是07年一个学长(谢谢这位好心人!
)写的上机题目:
计算机07复试上机
今年上机分数集中在40~60之间,据说有两个0分,我写完七个57分
第三题闰年条件写得不对,自己改吧
第七题写的不够简单,当时只想出结果就行了,自己可以优化一下
今年编程源码可以保存在优盘或软盘,以前是软盘,优盘复试时候还,软盘不还
另外上机时间2小时,在编程时候先用记事本写上
#include
#include
#include
voidmain(){}
直接往里面贴就省时间了
我Q285605960,备注:
本校跨专业考计算机,有什么需要可以找我
下面的题目是我根据源码回忆的,可能不太准确,基本上是这样,主要是看看难度
1题目写出递归方程
2//找出这样的数:
本身是三位的完全平方数n(100<=n<1000),而且有有两位上的数字相同,如484
3//输入年份和月份,计算该年初到该年这个月底的总天数(注意闰年)
4//用牛顿迭代法求某正数n的平方根
5/求亲密数a,b(均为正整数):
a的所有因子(含1不含a本身)之和为b,若b的所有因子(含1不含b本身)之和为a,则a,b为亲密数,求满足a
6//给定数组,求连续三元素之和,输出和最大的第一个元素的下标
7//键盘输入正整数序列-1结尾,以此按升序建立双向循环链表,并降序输出
8键盘输入算数表达式(字符串的),求计算结果.(这题没来得及)
//以下是源码,我写的
1题目写出递归方程#include
#include
floatfun(floatx,intn){
if(0==n){
return1;
}elseif(1==n){
returnx;
}else{
return((2*n-1)*x-fun(x,n-1)-(n-1)*fun(x,n-2)/n);
}
}
voidmain(){
intn;
floatp,x;
cout< cout<cout<}//main
2//找出这样的数:
本身是三位的完全平方数n(100<=n<1000),而且有有两位上的数字相同,如484
#include
#include
#include
intfun1(intn){
inttemp;
temp=(int)sqrt(n);
if(n==temp*temp){
return1;
}else{
return0;
}
}
intfun2(intn){
inta[3],i;
for(i=0;i<3;i++){
a=n%10;
n/=10;
}
if(a[0]==a[1]||a[1]==a[2]||a[0]==a[2]) return1;
elsereturn0;
}
voidmain(){
intn;
for(n=100;n<1000;n++){
if(fun1(n)&&fun2(n)){
cout<<"n="< }
}
}//main
3//输入年份和月份,计算该年初到该年这个月底的总天数(注意闰年)
#include
#include
#include
intleapyear(intyear){
if(year%4==0||year%400==0){
return1;
}elsereturn0;
}
voidmain(){
intyear,month;
intnum=0,feb=0;
cout<<"请输入年份n和月份m"<cin>>year>>month;
if(leapyear(year))feb=29;
elsefeb=28;
switch(month){
case1:
num=num+31;break;
case2:
num=num+31+feb;break;
case3:
num=num+31+feb+31;break;
case4:
num=num+31+feb+31+30;break;
case5:
num=num+31+feb+31+30+31;break;
case6:
num=num+31+feb+31+30+31+30;break;
case7:
num=num+31+feb+31+30+31+30+31;break;
case8:
num=num+31+feb+31+30+31+30+31+31;break;
case9:
num=num+31+feb+31+30+31+30+31+31+30;break;
case10:
num=num+31+feb+31+30+31+30+31+31+30+31;break;
case11:
num=num+31+feb+31+30+31+30+31+31+30+31