第5周
5.1 数组
类型名 数组名[元素个数],其中“元素个数”必须是常量或常量表达式,不能是变量,也必须是正整数。
数组元素在内存里一个挨一个连续存放。
5.2 筛法求素数
空间换时间,加快计算速度。
5.3 数组的初始化
初始化时,{}中值的个数可以小于元素个数。相当于只给前面部分元素赋值,而后面的元素的存储空间里每个字节都被写入二进制数0。
5.4 数组越界
5.5 二维数组
T a[N][M]; sizeof(a)的值是整个数组的体积,即N*M*sizeof(T)。
初始化时,如果对每行都进行了初始化,则也可以不给出行数。
作业
1.与指定数字相同的数的个数
Description:输出一个整数序列中与指定数字相同的数的个数。
Input:
输入包含三行:
第一行为N,表示整数序列的长度(N <= 100);第二行为N个整数,整数之间以一个空格分开;第三行包含一个整数,为指定的整数m。
Output:输出为N个数中与m相同的数的个数。
Sample Input:
3
2 3 2
2
Sample Output:2
1 #include <cstdio>
2
3 #define maxn 110
4 int arr[maxn];
5
6 int main()
7 {
8 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
9
10 int n, m;
11 int counter = 0;
12 scanf("%d", &n);
13 for(int i=0; i<n; i++) {
14 scanf("%d", &arr[i]);
15 }
16 scanf("%d", &m);
17 for(int i=0; i<n; i++) {
18 if(arr[i] == m)
19 counter++;
20 }
21
22 printf("%d\n", counter);
23
24 return 0;
25 }
2.陶陶摘苹果
Description:
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
Input:
包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
Output:包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
Sample Input:
100 200 150 140 129 134 167 198 200 111
110
Sample Output:5
1 #include <cstdio>
2
3 #define num 10
4 int arr[num];
5
6 int main()
7 {
8 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
9
10 int height;
11 int counter = 0;
12 for(int i=0; i<num; i++) {
13 scanf("%d", &arr[i]);
14 }
15 scanf("%d", &height);
16
17 for(int i=0; i<num; i++) {
18 if(arr[i] <= height+30)
19 counter++;
20 }
21
22 printf("%d\n", counter);
23
24 return 0;
25 }
3.年龄与疾病
Description:
某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理,按照0-18、19-35、36-60、61以上(含61)四个年龄段统计的患病人数占总患病人数的比例。
Input:共2行,第一行为过往病人的数目n(0 < n <= 100),第二行为每个病人患病时的年龄。
Output:
按照0-18、19-35、36-60、61以上(含61)四个年龄段输出该段患病人数占总患病人数的比例,以百分比的形式输出,精确到小数点后两位。每个年龄段占一行,共四行。
Sample Input:
10
1 11 21 31 41 51 61 71 81 91
Sample Output:
20.00%
20.00%
20.00%
40.00%
1 #include <cstdio>
2
3 #define num 5
4 int arr[num];
5
6 int main()
7 {
8 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
9
10 int n, tmp;
11 scanf("%d", &n);
12 for(int i=0; i<n; i++) {
13 scanf("%d", &tmp);
14 if(tmp>=0 && tmp<= 18)
15 arr[1]++;
16 else if(tmp>=19 && tmp<= 35)
17 arr[2]++;
18 else if(tmp>=36 && tmp<= 60)
19 arr[3]++;
20 else
21 arr[4]++;
22 }
23
24 for(int i=1; i<num; i++) {
25 printf("%.2f%%\n", (double)arr[i]/n*100);
26 //printf("%d\n", arr[i]);
27 }
28
29 return 0;
30 }
4.校门外的树
Description:
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
Input:
第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
对于20%的数据,区域之间没有重合的部分;对于其它的数据,区域之间有重合的情况。
Output:包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
Sample Input:
500 3
150 300
100 200
470 471
Sample Output:298
1 #include <cstdio>
2
3 #define num 10010
4 int arr[num];
5
6 int main()
7 {
8 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
9
10 int l, m;
11 int start, ends;
12 scanf("%d %d", &l, &m);
13 int counter = l+1;
14 for(int i=0; i<m; i++) {
15 scanf("%d %d", &start, &ends);
16 for(int j=start; j<=ends; j++)
17 arr[j] = 1;
18 }
19 for(int i=0; i<=l; i++) {
20 if(arr[i] == 1)
21 counter--;
22 }
23
24 printf("%d\n", counter);
25
26 return 0;
27 }
5.计算鞍点
Description:
给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。
例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8 )。
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25
Input:输入包含一个5行5列的矩阵
Output:如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出"not found"
Sample Input:
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25
Sample Output:4 1 8
1 #include <cstdio>
2
3 #define num 5
4 int arr[num][num];
5
6 int main()
7 {
8 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
9
10 for(int i=0; i<num; i++) {
11 for(int j=0; j<num; j++) {
12 scanf("%d", &arr[i][j]);
13 }
14 }
15
16 int tmp, row, col;
17 bool flag = false;
18 for(int i=0; i<num; i++) {
19 tmp = arr[i][0];
20 row = i;
21 col = 0;
22 for(int j=0; j<num; j++) {
23 if(arr[row][j] > tmp) {
24 col = j;
25 tmp = arr[row][col];
26 }
27 }
28 int k = 0;
29 for(; k<num; k++) {
30 if(tmp > arr[k][col])
31 break;
32 }
33 if(k == num) {
34 flag = true;
35 printf("%d %d %d\n", row+1, col+1, tmp);
36 }
37 }
38 if(!flag)
39 printf("not found\n");
40
41 return 0;
42 }
6.图像模糊处理
Description:
给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:
1. 四周最外侧的像素点灰度值不变;2. 中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。
Input:
第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1 <= n <= 100,1 <= m <= 100。接下来n行,每行m个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在0~255之间。
Output:n行,每行m个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。
Sample Input:
4 5
100 0 100 0 50
50 100 200 0 0
50 50 100 100 200
100 100 50 50 100
Sample Output:
100 0 100 0 50
50 80 100 60 0
50 80 100 90 200
100 100 50 50 100
1 #include <cstdio>
2 #include <cmath>
3
4 #define num 100
5 int arr[num+10][num+10];
6 int arr1[num+10][num+10];
7
8 int main()
9 {
10 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
11
12 int n, m;
13 scanf("%d %d", &n, &m);
14 for(int i=0; i<n; i++) {
15 for(int j=0; j<m; j++) {
16 scanf("%d", &arr[i][j]);
17 arr1[i][j] = arr[i][j];
18 }
19 }
20
21 for(int i=1; i<n-1; i++) {
22 for(int j=1; j<m-1; j++) {
23 arr1[i][j] = (int)(round((double)(arr[i-1][j]+arr[i][j-1]+arr[i][j]+arr[i][j+1]+arr[i+1][j])/5));
24 }
25 }
26
27 for(int i=0; i<n; i++) {
28 for(int j=0; j<m; j++) {
29 printf("%d", arr1[i][j]);
30 if(j == m-1)
31 printf("\n");
32 else
33 printf(" ");
34 }
35 }
36
37 return 0;
38 }
7.矩阵转置
Description:输入一个n行m列的矩阵A,输出它的转置AT。
Input:
第一行包含两个整数n和m,表示矩阵A的行数和列数。1 <= n <= 100,1 <= m <= 100。
接下来n行,每行m个整数,表示矩阵A的元素。相邻两个整数之间用单个空格隔开,每个元素均在1~1000之间。
Output:m行,每行n个整数,为矩阵A的转置。相邻两个整数之间用单个空格隔开。
Sample Input:
3 3
1 2 3
4 5 6
7 8 9
Sample Output:
1 4 7
2 5 8
3 6 9
1 #include <cstdio>
2 #include <cmath>
3
4 #define num 100
5 int arr[num+10][num+10];
6
7 int main()
8 {
9 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
10
11 int n, m;
12 scanf("%d %d", &n, &m);
13 for(int i=0; i<n; i++) {
14 for(int j=0; j<m; j++)
15 scanf("%d", &arr[i][j]);
16 }
17
18 for(int j=0; j<m; j++) {
19 for(int i=0; i<n; i++) {
20 printf("%d", arr[i][j]);
21 if(i == n-1)
22 printf("\n");
23 else
24 printf(" ");
25 }
26 }
27
28 return 0;
29 }