华中科技大学计算机历年考研复试上机题
题目链接:
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 1002
void 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 27
typedef 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 101
int 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_MIN
int 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