华科计算机考研机试真题汇总上篇(C语言)


一、2000年华科机试题

1.阶乘

题目描述

输入n, 求y1=1!+3!+…m!(m是小于等于n的最大奇数) y2=2!+4!+…p!(p是小于等于n的最大偶数)。

输入描述

每组输入包括1个整数:n。

输出描述

可能有多组测试数据,对于每组数据,输出题目要求的y1和y2。

#include<stdio.h>
//阶乘
int cal(int num)
{
   
   
	int N = 1,i;
	for(i = 1; i <= num; i++)
		N *= i;
	return N;
}
//累加
long add(int num)
{
   
   
	long N = 0;
	while(num > 0)
	{
   
    
		N += cal(num);
		num -= 2;
	}
	return N;
}
int main()
{
   
   
	long n;
	while(scanf("%d",&n) != EOF)
	{
   
   
		if(n % 2)
			printf("%ld %ld\n", add(n), add(n-1));
		else 	
			printf("%ld %ld\n", add(n-1), add(n));
	}
	return 0;
}

2.对称矩阵

题目描述

输入一个N维矩阵,判断是否对称。

输入描述

输入第一行包括一个数:N(1<=N<=100),表示矩阵的维数。接下来的N行,每行包括N个数,表示N*N矩阵的元素。

输出描述

可能有多组测试数据,对于每组数据,输出"Yes!”表示矩阵为对称矩阵,输出"No!”表示矩阵不是对称矩阵。

#include<stdio.h>
#include<stdlib.h>
int main()
{
   
   
	int N;
	while(scanf("%d", &N) != EOF)
	{
   
   
		int **array, i, j;
		//动态分配二维数组,也可直接定义大数组
		array = (int **)malloc(sizeof(int *) * N);
		for(i = 0; i < N; i++)
			array[i] = (int *)malloc(sizeof(int) * N);
		for(i = 0; i < N; i++)
			for(j = 0; j < N ;j++)
				scanf("%d", &array[i][j]);
		int flag=1;
		for(i = 0; i < N; i++)
			for(j = i + 1; j < N ;j++)
				if(array[i][j] != array[j][i])
					flag = 0;
		if(flag)
			printf("Yes!\n");
		else	printf("No!\n");
		free(array);
	}
	return 0;
}

3.遍历链表

题目描述

建立一个升序链表并遍历输出。

输入描述

输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。

输出描述

可能有多组测试数据,对于每组数据,将n个整数建立升序链表,之后遍历链表并输出。

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
   
   
	int num;
	struct LNode *next;
}LNode, *LinkList;
void insertList(LinkList L,int temp)
{
   
   
	LNode *p = L -> next;
	LNode *q = L;
	//找到插入位置
	while(p != NULL && temp > p->num)
	{
   
   
		q = p;
		p = p->next;
	}
	p=(LNode *)malloc(sizeof(LNode));
	p->num = temp;
	p->next = q->next;
	q->next = p;	
}

void deleteList(LinkList L)
{
   
   
	LNode *p = L -> next;
	LNode *q = L;
	do
	{
   
   
		free(q);
		q = p;
		p = p->next;
	}while(p);

}
int main()
{
   
   
	int n;
	while(scanf("%d", &n) != EOF)
	{
   
   
		LinkList L = (LNode *)malloc(sizeof(LNode));
		L->next = NULL;
		int temp;
		for(int i = 0; i < n; i++)
		{
   
   
			scanf("%d", &temp);
			insertList(L,temp);
		}
		LNode *p = L->next;
		while(p)
		{
   
   
			printf("%d ",p->num);
			p = p->next;
		}
		printf("\n");
		deleteList(L);
	}
	return 0;
}

二、2001年华科机试题

1.找位置

题目描述

对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 输出:a,1;a,4;a,5;a,10,b,2;b,11,1,8;1,12, 2,9;2,13。

输入描述

输入包括一个由字母和数字组成的字符串,其长度不超过100。

输出描述

可能有多组测试数据,对于每组数据,按照样例输出的格式将字符出现的位置标出。
 1.下标从0开始。
 2.相同的字母在一行表示出其出现过的位置。
注意:牛客网OJ需另谋它法

#include<stdio.h>
int main()
{
   
   
	int count[128] = {
   
   0};		//计数数组
	int str[128][100];			//位置数组
	char ch;
	int flag = 0;					//记录当前位置
	while((ch = getchar()) != '\n')
	{
   
   
		str[ch][count[ch]] = flag;
		count[ch]++;
		flag++;
	}
	for(int i = 0; i<128 ; i++)
		if(count[i] > 1)
		{
   
   
			for(int j =0; j < count[i]; j++)
			{
   
   
				if(j != (count[i]-1))
					printf("%c:%d,", i, str[i][j]);
				else printf("%c:%d\n", i, str[i][j]);
			}
		}
	return 0;
}

2.最大的两个数

题目描述

输入一个四行五列的矩阵,找出每列最大的两个数。

输入描述

接下来的四行每行包括五个整数。代表一个四行五列的矩阵,矩阵元素全部是整数。

输出描述

可能有多组测试数据,对于每组数据,按照样例输出的格式将每列最大的两个数输出,如果最大的两个数中的一个数在这一列中有多个相同的值,则行值取行值小的那一个。输出时要保留原矩阵的行列顺序,即在原矩阵中行值小的,在输出矩阵中的行值依然小。

#include<stdio.h>
int main()
{
   
   
	int i, j, num, array[2][5];
	for(i = 0; i < 4; i++)
		for(j = 0; j < 5; j++)
		{
   
   
			scanf("%d", &num);
			if(i == 0 || i == 1)
			//前两行直接放入数组
				array[i][j] = num;
			else if(num > array[0][j] || num > array[1][j])
			{
   
   //判断num是否会放入数组							
				if(array[0][j] < array[1][j])
			//将第二行放入第一行,然后num放入第二行保留原有顺序
					array[0][j] = array[1][j];
				array[1][j] = num;
			}

		}
	for(i = 0; i < 2; i++)
	{
   
   
		for(j =0; j < 5; j++)
			printf("%d ", array[i][j]);
		printf("\n");
	}
}

3.链表删除最大数

题目描述

建立一个链表,以输入0为结束,删除其中数值最大的元素,并输出删除元素后的链表(不能用数组)。

#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode
{
   
   
	int num;
	struct LinkNode *next;
}LNode, *LinkList;
//插入元素
void _stdcall insertList(LinkList L, int num)
{
   
   
	LNode *p = L, *q;
	while(p->next)
		p = p->next;
	q = (LNode *)malloc(sizeof(LNode));
	q ->num = num;
	p->next = q
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值