本文主要是介绍华中科技大学计算机历年考研复试上机题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:
https://www.nowcoder.com/ta/hust-kaoyan?page=1
1.矩阵转置
题目描述
输入一个N*N的矩阵,将其转置后输出。要求:不得使用任何数组(就地逆置)。
#include <iostream>
#include <vector>
#include <math.h>
#include<stdlib.h>
using namespace std;int main()
{int n, i, j;cin>>n;int a[n][n];for(i = 0; i<n; i++){for(j=0; j<n; j++){cin>>a[j][i];}}for(i = 0; i<n; i++){for(j=0; j<n; j++){cout<<a[i][j]<<" ";}cout<<endl;}
}
2.统计单词
题目描述
编一个程序,读入用户输入的,以“.”结尾的一行文字,统计一共有多少个单词,并分别输出每个单词含有多少个字符。 (凡是以一个或多个空格隔开的部分就为一个单词)
#include <iostream>
#include <vector>
#include <string>
#include <math.h>
#include<stdlib.h>
using namespace std;int main()
{vector<int> a(100);string s;int cnt = 0;while(cin>>s){
// cout<<s<<" ";if(s.find_last_of(".")!=string::npos){a[cnt] = s.length()-1;break;}a[cnt] = s.length();
// cout<<a[cnt];cnt++;}for(int i =0; i<=cnt; i++){cout<<a[i]<<" ";}
}
3.IP地址
题目描述
输入一个ip地址串,判断是否合法。
#include<stdio.h>
int check(int a){if(a>=0 && a<=255) return 1;return 0;
}
int main(){int a, b, c, d;char ip[10100];while(~scanf("%s", ip)){sscanf(ip, "%d.%d.%d.%d", &a, &b, &c, &d);if(check(a) && check(b) && check(c) && check(d) && a != 0) printf("Yes!\n");else printf("No!\n");}}
4.二叉排序树
题目描述
二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值; 2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值; 3. 左、右子树本身也是一颗二叉排序树。 现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。
#include <stdio.h>
#include <stdlib.h>typedef struct BinTreeNode *BinTree;
struct BinTreeNode{int data;BinTree left,right;
};int f = -1;
BinTree Insert(BinTree T, int x, int p){if(!T){T = (BinTree)malloc(sizeof(struct BinTreeNode));T->data = x;T->left = T->right = NULL;f = p;}else{if(x < T->data) T->left = Insert(T->left, x, T->data);else T->right = Insert(T->right, x, T->data);}return T;
}
int main()
{int n,x;BinTree BT = NULL;while(~scanf("%d",&n)){for(int i = 0;i<n;i++){scanf("%d",&x);BT = Insert(BT,x,-1);printf("%d\n",f);}}return 0;
}
5.字符串连接
题目描述
不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 101
int main()
{char str1[Maxsize], str2[Maxsize];while(~scanf("%s %s",str1, str2)){printf("%s%s\n",str1,str2);}return 0;
}
6.a+b
题目描述
实现一个加法器,使其能够输出a+b的值。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Maxsize 1002void reverse(char a[], int len){char temp;for(int i = 0;i<len/2;i++){temp = a[i];a[i] = a[len-1-i];a[len-1-i] = temp;}
}
int main()
{char t1[Maxsize], t2[Maxsize];int len1,len2,i;while(~scanf("%s %s",t1,t2)){int res[Maxsize];i = 0;len1 = strlen(t1);len2 = strlen(t2);reverse(t1, len1);reverse(t2, len2);while(i<len1&&i<len2){res[i] = t1[i]+t2[i]-'0'-'0';i++;}while(i<len1){res[i] = t1[i]-'0';i++;}while(i<len2){res[i] = t2[i]-'0';i++;}res[i] = 0;for(int j = 0;j<i;j++){if(res[j]>9){res[j] = res[j]%10;res[j+1]++;}}if(res[i]!=0) printf("%d",res[i]);for(int j = i-1;j>=0;j--) printf("%d",res[j]);printf("\n");}return 0;
}
7.排序
题目描述
对输入的n个数进行排序并输出。
#include <iostream>
#include <set>using namespace std;
template<class T>
void print(T first, T last){for(;first!=last;++first) cout<<*first<<" ";cout<<endl;
}int main()
{int n;while(cin>>n){int t[n];for(int i=0;i<n;i++){cin>>t[i];}multiset<int> p(t,t+n);print(p.begin(),p.end());}return 0;
}
8.特殊排序
题目描述
输入一系列整数,将其中最大的数挑出(如果有多个,则挑出一个即可),并将剩下的数进行排序,如果无剩余的数,则输出-1。
#include <iostream>
#include <set>using namespace std;
template<class T>
void print(T first, T last){last--;cout<<*last<<endl;if(first==last) cout<<"-1";else{for(;first!=last;++first) cout<<*first<<" ";}cout<<endl;
}int main()
{int n;while(cin>>n){int t[n];for(int i=0;i<n;i++){cin>>t[i];}multiset<int> p(t,t+n);print(p.begin(),p.end());}return 0;
}
9. 二叉树遍历
题目描述
二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树; 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Maxsize 27typedef struct BTreeNode *BTree;
struct BTreeNode{char data;BTree left,right;
};BTree Creat(char s1[], char s2[], int lf, int ll, int rf, int rl){if(lf>ll||rf>rl) return NULL;int i;for(i = rf; i<=rl; i++ ){if(s2[i]==s1[lf]) break;}BTree p = (BTree)malloc(sizeof(struct BTreeNode));p->data = s1[lf];p->left = Creat(s1, s2, lf+1, lf+i-rf, rf, i-1);p->right = Creat(s1, s2, lf+i-rf+1, ll, i+1, rl);return p;
}void postTravel(BTree BT){if(BT){postTravel(BT->left);postTravel(BT->right);printf("%c",BT->data);}
}
int main()
{char s1[Maxsize], s2[Maxsize];BTree BT;int len;while(~scanf("%s",s1)&&~scanf("%s",s2)){len = strlen(s1);BT = Creat(s1, s2, 0, len-1, 0, len-1);postTravel(BT);printf("\n");}
}
10.奇偶校验
题目描述
输入一个字符串,然后对每个字符进行奇校验,最后输出校验后的二进制数(如’3’,输出:10110011)。
#include <stdio.h>
#include <string.h>
#define Maxsize 101int judge[8],sum;
void toBinary(char c){int temp = (int)c;for(int i = 7;temp!=0;i--){judge[i] = temp%2;if(judge[i]==1) sum++;temp = temp/2;}
}int main()
{char a[Maxsize];while(~scanf("%s",a)){for(int i = 0;i<strlen(a);i++){sum = 0;for(int j = 0;j<8;j++) judge[j] = 0;toBinary(a[i]);if(sum%2==1){for(int j =0;j<8;j++) printf("%d",judge[j]);}else{judge[0] = 1;for(int j =0;j<8;j++) printf("%d",judge[j]);}printf("\n");}}return 0;
}
11.最大的两个数
题目描述
输入一个四行五列的矩阵,找出每列最大的两个数。
输入描述:
接下来的四行每行包括五个整数。代表一个四行五列的矩阵,矩阵元素全部是整数。
输出描述:
可能有多组测试数据,对于每组数据,按照样例输出的格式将每列最大的两个数输出,如果最大的两个数中的一个数在这一列中有多个相同的值,则行值取行值小的那一个。
输出时要保留原矩阵的行列顺序,即在原矩阵中行值小的,在输出矩阵中的行值依然小。
#include <stdio.h>
#include <limits.h>
#define min INT_MINint main()
{int a[4][5],out[2][5];int max1,max2,m1,m2;while(~scanf("%d",&a[0][0])){for(int i = 0;i<4;i++){for(int j = 0;j<5;j++){if(i==0&&j==0) continue;scanf("%d",&a[i][j]);}}for(int j = 0;j<5;j++){max1 = max2 = min;for(int i = 0;i<4;i++){if(a[i][j]>max1){max1 = a[i][j];m1 = i;}}for(int i = 0;i<4;i++){if(a[i][j]>max2&&i!=m1){max2 = a[i][j];m2 = i;}}if(m1<m2){out[0][j] = max1; out[1][j] = max2;}else{out[0][j] = max2; out[1][j] = max1;}}for(int i=0;i<2;i++){for(int j = 0;j<5;j++){printf("%d ",out[i][j]);}printf("\n");}}return 0;
}
12.成绩排序
题目描述
有N个学生的数据,将学生数据按成绩从高到低排序,如果成绩相同则按姓名字符的字典序排序,如果姓名的字典序也相同则按照学生的年龄从小到大排序,并输出N个学生排序后的信息。
#include <stdio.h>
#include <string.h>struct Students{char name[105];int age;int score;
};int comp(const void *a,const void *b){struct Students *s1, *s2;s1 = (const struct Students *)a;s2 = (const struct Students *)b;if(s1->score > s2->score) return 1;else if(s1->score < s2->score) return -1;else{if(strcmp(s1->name,s2->name)>0) return 1;else if(strcmp(s1->name,s2->name)<0) return -1;else{if(s1->age > s2->age ) return 1;else return -1;}}
}
int main(){int n;struct Students stu[1001];while(~scanf("%d",&n)){for(int i = 0;i<n;i++){scanf("%s %d %d",stu[i].name,&stu[i].age,&stu[i].score);}qsort(stu,n,sizeof(struct Students),comp);for(int i = 0;i<n;i++){printf("%s %d %d\n",stu[i].name,stu[i].age,stu[i].score);}}return 0;
}
13.遍历链表
题目描述
建立一个升序链表并遍历输出。
#include <stdio.h>
int comp(const void *a,const void *b)
{return *(int *)a-*(int *)b;
}
int main()
{int n, a[1000];while(~scanf("%d",&n)){for(int i = 0;i<n;i++){scanf("%d",&a[i]);}qsort(a,n,sizeof(int),comp);for(int i = 0;i<n;i++)printf("%d ",a[i]);printf("\n");}
}
14.守形数
题目描述
守形数是这样一种整数,它的平方的低位部分等于它本身。 比如25的平方是625,低位部分是25,因此25是一个守形数。 编一个程序,判断N是否为守形数。
#include <stdio.h>int IsShouxing(int n){int m = n*n;while(n!=0){if(n%10!=m%10){return 0;}n =n/10;m = m/10;}return 1;
}
int main(){int n,m;while(~scanf("%d",&n)){if(IsShouxing(n)) printf("Yes!\n");else printf("No!\n");}return 0;
}
15.矩阵最大值
题目描述
编写一个程序输入一个mXn的矩阵存储并输出,并且求出每行的最大值和每行的总和。 要求把每行总和放入每行最大值的位置,如果有多个最大值,取下标值最小的那一个作为最大值。 最后将结果矩阵输出
#include <stdio.h>
int square[100][100];int main()
{int m,n,sum,max,c;while(~scanf("%d %d",&m,&n)){for(int i = 0;i<m;i++){sum = 0;for(int j=0;j<n;j++){scanf("%d",&square[i][j]);sum +=square[i][j];}c = 0;max = square[i][0];for(int j=0;j<n;j++){if(square[i][j]>max){c = j;max = square[i][j];}}square[i][c] = sum;}for(int i = 0;i<m;i++){for(int j=0;j<n;j++){printf("%d ",square[i][j]);}printf("\n");}}return 0;
}
16.最小年龄的三个职工
题目描述
职工有职工号,姓名,年龄.输入n个职工的信息,找出3个年龄最小的职工打印出来。
#include <stdio.h>
#include <string.h>struct Employees{char name[11];int age;int number;
};int comp(const void *a,const void *b){struct Employees *s1, *s2;s1 = (const struct Employees *)a;s2 = (const struct Employees *)b;if(s1->age > s2->age) return 1;else if(s1->age < s2->age) return -1;else{if(s1->number > s2->number) return 1;else if(s1->number < s2->number) return -1;else{if(strcmp(s1->name,s2->name)>0) return 1;else return -1;}}
}
int main(){int n;struct Employees stu[1001];while(~scanf("%d",&n)){for(int i = 0;i<n;i++){scanf("%d %s %d",&stu[i].number,stu[i].name,&stu[i].age);}qsort(stu,n,sizeof(struct Employees),comp);if(n>=3){for(int i = 0;i<3;i++){printf("%d %s %d\n",stu[i].number,stu[i].name,stu[i].age);}}else{for(int i = 0;i<n;i++){printf("%d %s %d\n",stu[i].number,stu[i].name,stu[i].age);}}}return 0;
}
17.对称矩阵
题目描述
输入一个N维矩阵,判断是否对称。
#include <stdio.h>int square[100][100];int main()
{int n,flag;while(~scanf("%d",&n)){for(int i = 0; i<n; i++){for(int j=0;j<n;j++){scanf("%d", &square[i][j]);}}flag = 1;for(int i = 0; i<n; i++){for(int j=0;j<i;j++){if(square[i][j]!=square[j][i]){flag = 0;}}}if(flag ==0) printf("No!\n");else printf("Yes!\n");}return 0;
}
18.A+B
题目描述
给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。 现在请计算A+B的结果,并以正常形式输出。
#include <stdio.h>
#include <string.h>
int transfer(char a[]){int f = 0,i = 0,sum = 0;if(a[0]=='-'){f = 1; i++;}for(;i<strlen(a);i++){if(a[i]==',') continue;sum = sum*10+a[i]-'0';}if(f) sum = -sum;return sum;
}
int main()
{char a[15],b[15];while(~scanf("%s %s",a,b)){printf("%d\n",transfer(a)+transfer(b));}return 0;
}
19.打印日期
题目描述
给出年分m和一年中的第n天,算出第n天是几月几号。
#include <stdio.h>int isLeafYear(int y)
{if(y%4==0&&y%100!=0) return 1;else if(y%400==0) return 1;else return 0;
}int main()
{int year,n,m,day,sum;int mouth[12] = {31,29,31,30,31,30,31,31,30,31,30,31};while(~scanf("%d %d",&year,&n)){sum = 0;if(isLeafYear(year)==0) mouth[1]=28;else mouth[1]=29;for(m = 0;n>sum;m++){sum = sum+mouth[m];}day = n-sum+mouth[m-1];printf("%04d-%02d-%02d\n",year,m,day);}return 0;
}
20.二叉排序树
题目描述
输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。
#include <stdio.h>
#include <stdlib.h>typedef struct BinTreeNode *BinTree;
struct BinTreeNode{int data;BinTree left,right;
};BinTree Insert(BinTree BT, int x)
{if(!BT){BT = (BinTree)malloc(sizeof(struct BinTreeNode));BT->data = x;BT->left = BT->right = NULL;}else{if(x<BT->data)BT->left = Insert(BT->left, x);else if(x>BT->data)BT->right = Insert(BT->right, x);}return BT;
}void PreTravel(BinTree BT)
{if(BT){printf("%d ",BT->data);PreTravel(BT->left);PreTravel(BT->right);}}void MiddleTravel(BinTree BT)
{if(BT){MiddleTravel(BT->left);printf("%d ",BT->data);MiddleTravel(BT->right);}
}void PostTravel(BinTree BT)
{if(BT){PostTravel(BT->left);PostTravel(BT->right);printf("%d ",BT->data);}
}int main()
{int n,x;BinTree BT;while(~scanf("%d",&n)){BT = NULL;for(int i = 0;i<n;i++){scanf("%d",&x);BT = Insert(BT,x);}PreTravel(BT); printf("\n");MiddleTravel(BT); printf("\n");PostTravel(BT); printf("\n");}return 0;
}
21.大整数排序
题目描述
对N个长度最长可达到1000的数进行排序。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int comp(const void *a, const void *b)
{char **c1,**c2;c1 = (const char **)a;c2 = (const char **)b;if(strlen(*c1)>strlen(*c2)) return 1;else if(strlen(*c1)<strlen(*c2)) return -1;else{if(strcmp(*c1,*c2)>0) return 1;else return -1;}
}int main()
{char *p[101];int n;while(~scanf("%d\n",&n)){for(int i = 0;i<n;i++){p[i] = (char *)malloc(1001*sizeof(char));gets(p[i]);}qsort(p,n,sizeof(char *),comp);for(int i = 0;i<n;i++){printf("%s\n",p[i]);}}return 0;
}
22.N阶楼梯上楼问题
题目描述
N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。(要求采用非递归)
#include <stdio.h>
int arr[90];int main()
{int n;arr[1] = 1;arr[2] = 2;while(~scanf("%d",&n)){for(int i = 3;i<=n;i++){arr[i] = arr[i-1] +arr[i-2];}printf("%d\n",arr[n]);}return 0;
}
23.a+b
题目描述
计算a+b的和
#include <stdio.h>int main()
{int a,b;while(~scanf("%d %d",&a,&b)){printf("%d\n",a+b);}return 0;
}
24.回文字符串
题目描述
给出一个长度不超过1000的字符串,判断它是不是回文(顺读,逆读均相同)的。
#include <stdio.h>
#include <string.h>
int main()
{char str[1001];while(~scanf("%s",str)){int flag = 1;for(int i = 0;i<strlen(str)/2;i++){if(str[i]!=str[strlen(str)-1-i]){flag = 0;break;}}if(flag == 0) printf("No!\n");else printf("Yes!\n");}return 0;
}
25.找位置
题目描述
对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 输出:a,1;a,4;a,5;a,10,b,2;b,11,1,8;1,12, 2,9;2,13。
#include <stdio.h>
#include <string.h>int main()
{char str[101];while(~scanf("%s",str)){int hash[128];for(int i = 0;i<128;i++) hash[i] = 0;for(int i = 0;i<strlen(str);i++){hash[(int)str[i]]++;}for(int i = 0;i<strlen(str);i++){if(hash[(int)str[i]]>1){for(int j = 0;j<strlen(str);j++){if(str[j]==str[i]){printf("%c:%d",str[j],j);if(--hash[(int)str[i]]!=0) printf(",");}}printf("\n");}}}return 0;
}
26. 阶乘
题目描述
输入n, 求y1=1!+3!+…m!(m是小于等于n的最大奇数) y2=2!+4!+…p!(p是小于等于n的最大偶数)。
#include <stdio.h>int main()
{int n;while(~scanf("%d",&n)){if(n%2==0){int odd[n/2],even[n/2],sum1=1,sum2=2;odd[0] = 1;even[0] = 2;for(int i=1;i<n/2;i++){odd[i] = odd[i-1]*(2*i)*(2*i+1);even[i] = even[i-1]*(2*i+1)*(2*i+2);sum1 = sum1+odd[i];sum2 = sum2 +even[i];}printf("%d %d\n",sum1,sum2);}else{int odd[(n+1)/2],even[n/2],sum1=1,sum2=2;odd[0] = 1;even[0] = 2;for(int i=1;i<n/2;i++){odd[i] = odd[i-1]*(2*i)*(2*i+1);even[i] = even[i-1]*(2*i+1)*(2*i+2);sum1 = sum1+odd[i];sum2 = sum2 +even[i];}odd[(n+1)/2-1] = odd[(n-1)/2-1]*(n-1)*n;sum1 = sum1 + odd[(n+1)/2-1];printf("%d %d\n",sum1,sum2);}}return 0;
}
27.八进制
题目描述
输入一个整数,将其转换成八进制数输出。
#include <stdio.h>int main()
{int n;while(~scanf("%d",&n)){printf("%o\n",n);}return 0;
}
28.最长&最短文本
题目描述
输入多行字符串,请按照原文本中的顺序输出其中最短和最长的字符串,如果最短和最长的字符串不止一个,请全部输出。
#include<stdio.h>
#include<string.h>int main()
{int m=0,i;char zi[1001][1001];while(gets(zi[m])!=NULL) {m++;}int max,min;
max = strlen(zi[0]);
min=strlen(zi[0]);for(i=1;i<m;i++){if(min>strlen(zi[i])) min=strlen(zi[i]);if(max<strlen(zi[i])) max=strlen(zi[i]);}for(i=0;i<m;i++){if(min==strlen(zi[i])) printf("%s\n",zi[i]);}for(i=0;i<m;i++){if(max==strlen(zi[i])) printf("%s\n",zi[i]);}return 0;
}
29.农夫,羊,菜和狼的故事
题目算法以及代码参见:
https://blog.csdn.net/sharon_1995/article/details/104086941
这篇关于华中科技大学计算机历年考研复试上机题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!