北航2017机试真题

1、输入一个整数n,然后输入n个整数,对这n个整数排序后输出中间的那个数,如果输入的n是偶数则输出中间两个数的平均数.
// 17年第1题;


#include<stdio.h>


int main(){
int n;
while (scanf("%d",&n)!=EOF){
int i,j,k;
int a[100];
  for (i=0;i<n;i++)
 scanf("%d",&a[i]);
  for(j=0;j<n-1;j++)
 for(k=0;k<n-1-j;k++)   //冒泡排序
 if (a[j]>a[j+1]){
   int temp;
temp=a[j];
a[j]=a[j+1];
   a[j+1]=temp;  
 }
   if(n%2==0)
  printf("%d\n",(a[n/2-1]+a[n/2])/2);//判n奇偶
   else 
  printf("%d\n",a[n/2]);
}
return 0;
}


2、给定定义变量的表达式,提取其中的变量名。




// 17年第2题;


// 此题是针对标准的变量定义来写的,例如 int sum,max; char str;等
#include<stdio.h>
#include<string.h>
// using namespace std;
int main(){
char str[100];
while(gets(str)!=NULL){
int i,j,k,t,m,n;
k=strlen(str)-1;//注一下strlen函数求得是实际长度,不包括\0


for(i=k;i>=0;i--){
  if(str[i]!=';')
        continue;
    j=i-1;      //从后往前遍历,找到变量的长度终点
m=j;
        break;
}
for(i=j;i>=0;i--){


 if(str[i]!=' ')
continue;
     t=i+1;    // 找到变量长度的起点
break;
}    
 
 if(str[t]>='0'&&str[t]<='9')  //判变量的首字符是否为数字
 printf("变量格式不合法!\n");


else 
{for(n=t;n<=m;n++){
      if(str[n]==',') 
 printf(" ");
 else 
 printf("%c",str[n]);  //输出变量!
}
       printf("\n");


}


}
return 0;
}


3、
#include<stdio.h>   
#include<string.h>
#include<stdlib.h>  
#include<math.h>  
struct node{  
    char name[20];  
    int deep;  
    node *left,*right;  
};  
node *q[1005],*tmp;  
char na1[20],na2[20],na3[20];  
int deep;  
node *creatTree(int n){    //本质上就是层序建树,只不过节点是字符串类型,而非单个字符,此时用strcpy函数就行
    int front=1,rear=0;  
    node *root,*s,*l,*r;  
    root=NULL;  
    while(n--){  
       scanf("%s%s%s",na1,na2,na3);  
       s=NULL,l=NULL,r=NULL;  
       if(rear==0){  
       s=(node *)malloc(sizeof(node));  
       strcpy(s->name,na1);  
       s->left=NULL;s->right=NULL;  
       q[++rear]=s;  
        root=s;  
       }  
       s=q[front++];  
       l=(node *)malloc(sizeof(node));  
       strcpy(l->name,na2);  
       l->left=NULL;  
       l->right=NULL;  
       s->left=l;  
       q[++rear]=l;  
       r=(node *)malloc(sizeof(node));  
       strcpy(r->name,na3);  
       r->left=NULL;  
       r->right=NULL;  
       s->right=r;  
       q[++rear]=r;  
    }  
    return root;  
}  
  
void dfs(node *p,char na[],int h){  
    if(p==NULL)return ;  
    if(strcmp(na,p->name)==0){  
       tmp=p;deep=h;  
    }  
    dfs(p->left,na,h+1);  
    dfs(p->right,na,h+1);  
}  
node *lca(node *root,node *na1,node *na2){  //本质上为后序遍历求公共祖先结点,具体的基本思想可参考收藏的博客!
    if(root==NULL)return NULL;  
    if(root==na1||root==na2)return root;  
    node *ll=lca(root->left,na1,na2);  
    node *rr=lca(root->right,na1,na2);  
    if(ll&&rr)return root; // 这两个节点不存在一个节点是另一个节点的祖先的情况
    else if(ll)return ll;  //在左子树中存在上述的情况
    else if(rr)return rr;  //在右子树中存在上述的情况
    else return NULL;  
}  
int main()  
{  
    int i,n;  
    node *aim1,*aim2;  
    scanf("%d",&n);  
    node *root=creatTree(n);  
    scanf("%s%s",na1,na2);  
    dfs(root,na1,1);  //参数1是根节点的层数
    aim1=tmp,aim1->deep=deep;  
    dfs(root,na2,1);  
    aim2=tmp,aim2->deep=deep;  
    node *LCA=lca(root,aim1,aim2);  //求公共祖先
    printf("%s %d\n",LCA->name,abs(aim1->deep-aim2->deep));  //
    return 0;  
}  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值