华为机试热身(一)

考试须知

考察内容大致为:数组、链表、指针、字符串、循环、枚举、排序等

试题结构:三题,初级60分,中级100分,高级160分

考试时间:2小时
下面为收集的以前的机试题,并不是按照初中高级列出的

划线

描述:10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:
(1) 及格线是10的倍数;
(2) 保证至少有60%的学生及格;
(3) 如果所有的学生都高于60分,则及格线为60分

输入:输入10个整数,取值0~100
输出:输出及格线,10的倍数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<stdio.h>
#include<algorithm>
using namespace std;
void bubbleSort(int arr[],int n)
{

for (int i = 0; i < n-1; i++)
{
for (int j = 0; j < n - i-1; j++)
{
if (arr[j]>arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}

int main()
{

int num[10];
for (int i = 0; i<10; i++)
{
scanf("%d", &num[i]);
}
int ans = 0;
bubbleSort(num,10);
if (num[0] >= 60)
{
ans = 60;
}
else
{
ans = (num[4] / 10)*10;
}
printf("%d\n", ans);
return 0;
}

亮着的灯

一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。
注:电灯数和学生数一致。不能写笨拙的双重循环(优化过的是可以的),会运行超时。本题有运行时间限制(一说10000ms)。

输入 65535
输出 255

暴力法(肯定会超时的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<stdio.h>
#define MAX_NUM 65535
int bulb[MAX_NUM];

void light(int arr[],int n)
{

for (int i = 1; i <= n; i++)//学生
{
for (int j = 1; j <= n; j++)//灯泡
{
if (j%i == 0)
{
arr[j] = (arr[j] + 1) % 2;//改变灯泡
}
}
}
}

int main()
{

int n;
while (scanf("%d", &n) != EOF)
{
for (int i = 1; i <= n; i++)
{
bulb[i] = 0;
}
light(bulb, n);
int cnt = 0;
for (int i = 1; i <= n; i++)
{
if (bulb[i] == 1)
{
cnt++;
}
}
printf("%d\n", cnt);
}
return 0;
}

因子法

因为对于k号灯,只有前1-k号学生才会改变它的状态,进一步只有k的因子才能改变k的状态,我们只需要知道k有多少个因子就能判断出灯最终的状态,如果有偶数个因子,则灯是熄灭的,如果灯有奇数个因子,则灯是亮的。而对于一个数,因子都是成对出现的,如12的因子为1和12,2和6,3和4,这样看来一个数的因子数都是偶数个,只有当某个因子是乘以本身的时候,因子数才是奇数,如16的因子有,1和16,2和8,4,即当k是完全平方数时,它才有奇数个因子,它才是亮着的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
int main()
{

int n;
while (scanf("%d", &n) != EOF)
{
int cnt = 0;
for (int i = 1; i <= n; i++)
{
if (i*i < n)
{
cnt++;
}
else
break;
}
printf("%d\n", cnt);
}
return 0;
}

输出大写字母

输入一个字符串,输出其中的大写字母

输入 2, sdARSFGfg
输出 ARSFG

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include<string>
using namespace std;
int main()
{

char str[100];
while (scanf("%s", str) != EOF)
{
string s = str;
int len = s.length();
for (int i = 0; i < len; i++)
{
if (isalpha(s[i]) && isupper(s[i]))
//判断是否是字母,大写的,还有islower和isdigit
{
printf("%c",s[i]);
}
}
printf("\n");
}
return 0;
}