3.1 数组
程序 3-1 将不超过100个数逆序输出
#include<stdio.h> int main() { int const MAXN = 105; int a[MAXN]; int n = 1, x = 0; // //注意头疼的边界问题 // while (scanf("%d", &x) == 1) { a[n - 1] = x; n++; } for (int i = n-2; i >0; i--) printf("%d ", a[i]); printf("%d", a[0]); return 0; }
介绍两个数组操作的常用函数:
1. 数组不能直接如同 b = a 般赋值。需要用到<string.h>中的 memcpy(b, a, sizeof(int) * k)。从数组 a 赋值 k 个元素到数组 b
2.memset(a, 0, sizeof(a)) 作用是把 a 数组清零。
应用
#include<stdio.h> #include<string.h> int main() { int a[5], b[10]; //使用memset()函数将 a 数组清零 memset(a, 0, sizeof(a)); //遍历输出 for (int i =0; i < 5; i++) printf("%d ", a[i]); int x; for (int i = 0; i < 5; i++) { scanf("%d", &x); a[i] = x; } for (int i =0; i < 5; i++) printf("%d ", a[i]); memset(b, 0, sizeof(b)); for (int i =0; i < 10; i++) printf("%d ", b[i]); //应用memcpy()函数,将 a 数组中元素的值复制到 b 数组中 memcpy(b, a, sizeof(a)); for (int i =0; i < 10; i++) printf("%d ", b[i]); return 0; }
例题 3-2 开灯问题
现在有n盏灯,编号1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的灯的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的灯的开关(其中关掉的灯将被打开,开着的灯将被关闭),依次类推。一共有k个人,问最后哪些灯是开着的?输入n和k,k≤n≤1000。
样例输入:
7 3
样例输出:
1 5 6 7
程序 3-2 开灯问题
#include<stdio.h> #include<string.h> int a[1005]; int main() { //根据题意,有 n 盏灯,一共有 k 人 int k = 0, n = 0; scanf("%d%d", &n, &k); //技巧: 为了避免输出多余的空格,设置一个标志变量 first ,可以表示当前要输出的变量是否为第一个。第一个变量前面不加空格 int first = 1; //数组置零 memset(a, 0, sizeof(a)); //第一人先将所有灯打开,状态为 1 舍弃 a[0] 使之与实际对应 for (int i = 1; i <= n; i++) a[i] = 1; //j 代表第几人, 从第二个人开始 for (int j = 2; j <= k; j++) //k 代表第几盏灯 for (int k = 1; k <= n; k++) { //判断 k 是否为第几人的倍数,是 则 改变状态 if (k % j == 0) a[k] = !a[k]; } //输出值不为 0 的数组元素下标,与现实中的第几盏灯对应 for (int i = 1; i <= n; i++) { if (a[i]) { //是否为第一个输出 if (first) { printf("%d", i); first = 0; } else { printf(" "); printf("%d", i); } } } return 0; }