实验八 数组程序设计1 1. double 类型数组练习 说明 输入 n(0<n≤1000) 个小数,并将其依次输出。
输入输出格式及样例 输入数据:
第一行一个正整数 n; 第二行连续输入n 个 double 型浮点数。
5
29.495762 83.042158 69.332532 11.874342 47.989582
输出数据:
输出一行,将这n 个浮点数按输入顺序输出,保留 3 位小数。
29.496 83.042 69.333 11.874 47.990
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 #include <stdio.h> int main () { int n; scanf ("%d" , &n); double num[1000 ]; for (int i=0 ; i<n; i++){ scanf ("%lf" , &num[i]); } for (int i=0 ; i<n; i++){ printf ("%.3f " , num[i]); } return 0 ; }
2.输出月份的天数 说明 通过对一维数组的初始化赋值,我们可以将一些诸如:素数、斐波那契数列、月份天数之类的常量事先存储进去,然后通过下标或结合循环进行访问。
现在,请你编写一个小算法,输入一个年份及月份,输出对应的天数。
输入输出格式及样例 输入数据:两个整数 y,m(1600≤y≤10^4 ,1≤m≤12),分别代表年份和月份。
输出数据:输出对应的天数。
数据1
数据2
输入数据
1600 1
1600 2
输出数据
31
29
提示 闰年判断方法:
非整百年:年数除以 4 余数为 0 通常是闰年,但年数除以 100 余数为 0 的年份通常不是闰年,即公元 4、8、12……年;
整百年:年数除以 400 余数为 0 通常是闰年;年数除以 3200 余数为 0,通常不是闰年;年数除以 172800 余 0 又通常为闰年。
注意!!!整除3200不是闰年!!!
参考答案 1 2 3 4 5 6 7 8 9 #include <stdio.h> int main () { int d[2 ][12 ] = {{31 ,28 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31 },{31 ,29 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31 }}; int y, m; scanf ("%d %d" , &y, &m); int leep = (y%400 ==0 && y%3200 !=0 ) || (y%4 ==0 && y%100 !=0 ); printf ("%d" , d[leep][m - 1 ]); return 0 ; }
3. 老鹰捉小鸡 说明 狐狸老师和格莱尔等5位小朋友玩老鹰捉小鸡的游戏,狐狸老师当老鹰,排在第一位的小朋友当“母鸡”,其他4位小朋友当“小鸡”。但是“母鸡”很辛苦,所以过一段时间“母鸡”需要排到队伍最后成为“小鸡”,让第二位小朋友当“母鸡”······试编一程序,模拟10次位置变化的过程。
输入输出格式及样例 输入数据:无
输出数据:每行输出每一次的位置。注意每行尾没有空格!
1 2 3 4 5 6 7 8 9 10 1: 1 2 3 4 5 2: 2 3 4 5 1 3: 3 4 5 1 2 4: 4 5 1 2 3 5: 5 1 2 3 4 6: 1 2 3 4 5 7: 2 3 4 5 1 8: 3 4 5 1 2 9: 4 5 1 2 3 10: 5 1 2 3 4
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> int main () { int a[5 ] = {1 , 2 , 3 , 4 , 5 }; for (int i=0 ; i<10 ; i++){ printf ("%d:" , i+1 ); for (int j=0 ; j<5 ; j++){ printf (" %d" , a[j]); } printf ("\n" ); int k, t = a[0 ]; for (k=0 ; k<4 ; k++){ a[k] = a[k+1 ]; } a[k] = t; } return 0 ; }
4. 最重的苹果 说明 小 y 有n 个苹果,他知道每个苹果的重量。希望你能帮他找出最重的那个苹果,苹果编号为1,2,⋯,n。
输入输出格式及样例 输入数据:
第一行是一个正整数n,表示有n个苹果(1≤n≤1000)。
第二行包含n个整数 。
5
67 43 90 78 32
输出数据:一个整数,最重的苹果的编号。
3
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <stdio.h> int main () { int n; scanf ("%d" , &n); int max=0 , index=0 ; for (int i=0 ; i<n; i++){ int t; scanf ("%d" , &t); if (t> max){ max = t; index = i+1 ; } } printf ("%d" , index); return 0 ; }
5. 陶陶摘苹果 说明 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
输入输出格式及样例 输入数据:两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
100 200 150 140 129 134 167 198 200 111110
输出数据:一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
5
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <stdio.h> int main () { int n, m=30 , count=0 ; int apple[10 ]; for (int i=0 ; i<10 ; i++){ scanf ("%d" , &apple[i]); } scanf ("%d" , &n); for (int i=0 ; i<10 ; i++){ if (apple[i]<= m+n){ count++; } } printf ("%d" , count); return 0 ; }
6. 简单排序2 说明 在上周的 HHXL 小学四年级1000米自由泳比赛中,共有n(0<n≤100)名同学踊跃参赛,已知他们各自游完1000米的时间互不相同,请你算算小J能排第几名吧!
输入输出格式及样例 输入数据:
第1行1个正整数n,表示参赛的人数。
第2行连续输入n个正整数,表示各名队员游完1000米的秒数,均在[1,600]的范围内。
第3行1个正整数m,表示小J游完1000米的秒数。
5
50 55 30 59 43
43
输出数据:输出1个正整数,表示小J的名次。
2
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h> int main () { int n,m, count=1 ; int s[100 ]; scanf ("%d" , &n); for (int i=0 ; i<n; i++){ scanf ("%d" , &s[i]); } scanf ("%d" , &m); for (int i=0 ; i<n; i++){ if (s[i]<m){ count++; } } printf ("%d" , count); return 0 ; }
7. 初级计数排序 说明 小 J 最近终于学到了数组,他知道使用数组就可以对一个数列进行排序了!
今天,他小试牛刀,使用数组来对 n 个数字进行排序。你也会做吗?
输入输出格式及样例 输入数据:
第一行一个正整数n(0<n≤10^4 )
第二行连续输入 n 个不大于 10^4 的非负整数。
输出数据:
一行,输出这 n 个数从小到大排序后的结果,中间用一个空格隔开。
如果一个数出现了多次,在排序结果里只写一次即可。
数据1
数据2
输入数据
53 7 0 2 4
51 2 1 2 1
输出数据
0 2 3 4 7
1 2
参考答案 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 #include <stdio.h> int main () { int n; scanf ("%d" , &n); int num[10000 ]; for (int i=0 ; i<n; i++){ scanf ("%d" , &num[i]); } for (int i=0 ; i<n; i++){ for (int j=i+1 ; j<n; j++){ if (num[i]>num[j]){ int t = num[i]; num[i] = num[j]; num[j] = t; } } } int t=-1 ; for (int i=0 ; i<n; i++){ if (t != num[i]){ printf ("%d " , t=num[i]); } } return 0 ; }
8. 校门外的树 说明 某校大门外长度为L 的马路上有一排树,每两棵相邻的树之间的间隔都是1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 L 的位置;数轴上的每个整数点,即 0,1,2,…,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入输出格式及样例 输入数据:
第一行有两个整数L(1≤L≤10000) 和 M(1≤M≤100),L 代表马路的长度,M 代表区域的数目, L 和 M 之间用一个空格隔开。接下来的 M 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。 对于20% 的数据,区域之间没有重合的部分; 对于其它的数据,区域之间有重合的情况。
500 3
150 300
100 200
470 471
输出数据:包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
298
参考答案 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 #include <stdio.h> int main () { int L, M, count=0 ; scanf ("%d %d" , &L, &M); int s[100 ][2 ]; int t[10000 ]={0 }; for (int i=0 ; i<M; i++){ scanf ("%d %d" , &s[i][0 ], &s[i][1 ]); } for (int i=0 ; i<M; i++){ for (int j=s[i][0 ]; j<=s[i][1 ]; j++){ if (t[j] == 0 ){ t[j] = 1 ; } } } for (int i=0 ; i<=L; i++){ if (t[i] == 0 ){ count++; } } printf ("%d" , count); return 0 ; }
9. 数列的第 m 个数 说明 已知一个数列从第k个数开始,有连续的n个数,不断地循环出现,求其中的第m(m≥k)个数是几?
输入输出格式及样例 输入数据:
第一行两个整数,n,k(0<k≤100,0<n≤30)。
第二行连续的n 个整数,中间用空格隔开,表示从第k 个数开始连续n 个数。
第三行一个整数 m(k≤m≤10^9 )。
5 7
23 7 19 51 6
13
输出数据:输出一个整数,为所求的数字。
7
提示 23 是第 7 个数,数列开始进行 23, 7, 19, 51, 6, 23, 7, 19, 51, 6,…… 的循环,那么第 911 个数就是 6。
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h> int main () { int n,k,m; scanf ("%d %d" , &n, &k); int num[30 ]; for (int i=0 ; i<n; i++){ scanf ("%d" , &num[i]); } scanf ("%d" , &m); int key = (m - k + 1 )%n; key = key==0 ? n -1 : key -1 ; printf ("%d" , num[key]); return 0 ; }
10.折半查找法 说明 大魔导师培根曾经说过:“读史使人明智,读诗使人聪慧,演算使人精密,哲理使人深刻,伦理学使人有修养,逻辑修辞使人善辩。”由此可见书籍的重要性是不言而喻的。而与书籍天天打交道的图书管理员,更是夺天地之造化,吸日月之精华的“神之职业”。据史料记载,魔法世界从古至今诞生的众多不平凡的人物中,有不少人都曾经做过“图书管理员”,如道家学派创始人老子,威软公司创始人比耳、少林藏经阁的扫地神僧等等。所以,作为以马虎自负出名的楚继光,在魔法学院的社会实践活动中又怎么会放过这“天将降大任于斯人也”的必经锻炼呢。但想成为一个合格的图书管理员并不容易,他必须能够在一排(10000以内)已按编号大小排好序的图书中,快速地按编号查找到某本书所在的位置。
输入输出格式及样例 输入数据:输入文件第一行是N,表示有N个元素,第二行是N个按升序排好的数,第三行是M表示要查找的数。
3
2 4 6
4
输出数据:一个数,即如找到该数,则输出位置,否则输出-1
2
参考答案 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 #include <stdio.h> int main () { int n,m; int a[10000 ]; scanf ("%d" , &n); for (int i=0 ; i<n; i++){ scanf ("%d" , &a[i]); } scanf ("%d" , &m); int top=0 , bot=n-1 , mid; do { mid = (top + bot) / 2 ; if (m == a[mid]){ printf ("%d" , mid + 1 ); break ; } else if (m > a[mid]){ top = mid + 1 ; }else { bot = mid - 1 ; } }while (top<=bot); if (top>bot){ printf ("-1" ); } return 0 ; }
11. 矩阵交换行 说明 给定一个 5×5 的矩阵(数学上,一个 r×c 的矩阵是一个由 r 行 c 列元素排列成的矩形阵列),将第 n 行和第 m 行交换,输出交换后的结果。
输入输出格式及样例 输入数据:
输入共 6 行,前 5 行为矩阵的每一行元素,元素与元素之间以一个空格分开。 第 6 行包含两个整数 m,n,以一个空格分开。(1≤m,n≤5)
1 2 3 4 5 6 1 2 2 1 2 5 6 7 8 3 9 3 0 5 3 7 2 1 4 6 3 0 8 2 4 1 5
输出数据:输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。
1 2 3 4 5 3 0 8 2 4 5 6 7 8 3 9 3 0 5 3 7 2 1 4 6 1 2 2 1 2
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <stdio.h> int main () { int a[5 ][5 ], m,n; for (int i =0 ; i<5 ; i++){ for (int j=0 ; j<5 ; j++){ scanf ("%d" , &a[i][j]); } } scanf ("%d %d" , &m, &n); for (int i=0 ; i<5 ; i++){ int t = a[m-1 ][i]; a[m-1 ][i] = a[n-1 ][i]; a[n-1 ][i] = t; } for (int i =0 ; i<5 ; i++){ for (int j=0 ; j<5 ; j++){ printf ("%d " , a[i][j]); } printf ("\n" ); } return 0 ; }
12. 计算鞍点 说明 给定一个 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
输入输出格式及样例 输入数据:输入包含一个 5 行 5 列的矩阵,均为非负整数。
1 2 3 4 5 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
输出数据:如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出 not found。
4 1 8
参考答案 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 #include <stdio.h> int main () { int a[5 ][5 ]; for (int i =0 ; i<5 ; i++){ for (int j=0 ; j<5 ; j++){ scanf ("%d" , &a[i][j]); } } int max = a[0 ][0 ], row=0 , col=0 ; int i; for (i=0 ; i<5 ; i++){ for (int j=0 ; j<5 ; j++){ if (a[i][j] > max){ max = a[i][j]; row = i; col = j; } } int k; for (k=0 ; k<5 ; k++){ if (a[k][col]<max){ break ; } } if (k>=5 ){ printf ("%d %d %d" , row+1 , col+1 , a[row][col]); break ; } row = i+1 ; col = 0 ; max=a[row][col]; } if (i>=5 ){ printf ("not found" ); } return 0 ; }