华科历年机试题汇总
一、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