数组
- 逆序输出
#include<stdio.h> #define maxn 1000000 int a[maxn]; int main() { int x, n=0; // 输入 while(scanf("%d", &x) == 1) a[n++] = x; // 输出 for(int i=n-1; i>=1; i--){ printf("%d ", a[i]); } printf("%d\n", a[0]); return 0; }
a[n++]
,首先赋值a[n]=x
,然后执行n=n+1
- 对于变量n,n++和++n都会给n加1,但当它们用在一个表达式中时,行为有所差别:n++会使用加1的值计算表达式,而++n会使用加1后的值计算表达式
- 比较大的数组尽量声明在main函数外,否则程序可能无法运行
- 开灯问题
n盏灯,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关掉),依此类推。一共有k个人,问最后有哪些灯开着?
输入n和k,输出开着的灯的编号。k<=n<=1000。#include<stdio.h> #include<string.h> #define maxn 1010 int a[maxn]; int main() { int n, k, first = 1; // 数组a初始化为0 memset(a, 0, sizeof(a)); scanf("%d%d", &n, &k); // 模拟让每个人去按开关 for(int i=1; i<=k; i++){ for(int j=1; j<=n; j++){ if(j%i == 0){ a[j] = !a[j]; } } } // 输出 for(int i=1; i<=n; i++){ if(a[i]){ // 输出时第一个数字前无空格 if(first){ first = 0; }else{ printf(" "); } printf("%d", i); } } printf("\n"); return 0; }
memset(a, 0, sizeof(a));
的作用是把数组初始化为0,定义在string.h中。 - 蛇形填数
在nn方阵里填入1,2,…,nn,要求填成蛇形。n<=8。#include<stdio.h> #include<string.h> #define maxn 20 #define maxm 20 int a[maxn][maxm]; int main() { int n, x=0, y=0, tot = 0; scanf("%d", &n); memset(a, 0, sizeof(a)); tot = a[0][y=n-1] = 1; // 赋值过程 while(tot < n*n) { // 先向下走 while(x+1<n && !a[x+1][y]) { a[++x][y] = ++tot; } // 向左走 while(y-1>=0 && !a[x][y-1]) { a[x][--y] = ++tot; } // 向上走 while(x-1>=0 && !a[x-1][y]) { a[--x][y] = ++tot; } // 向右走 while(y+1<n && !a[x][y+1]) { a[x]