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;
}
// 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;
}