数组 例题解析
例题1.求矩阵的马鞍点。马鞍点即矩阵元素所在行的最大值,以及所在列的最小值。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> #define M 100 #define N 100 void main() { int i, j, k, m, n, flag; int a[M][N], max; printf("输入行数 m:"); scanf("%d", &m); printf("\n输入列数 n:"); scanf("%d", &n); srand((unsigned)time(NULL)); for (i = 0; i < m; i++) for (j = 0; j < n; j++) a[i][j] = rand() % 100; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) printf("%5d", a[i][j]); printf("\n"); } for (i = 0; i < m; i++) { max = a[i][0]; for (j = 1; j < n; j++) if (a[i][j] > max) max = a[i][j]; //找出行中的最大值 for (j = 0; j < n; j++) { flag = 0; if (a[i][j] == max)//定位到当前行最大值的列 { for (k = 0, flag = 1; k < m && flag; k++) if (a[k][j] < max) flag = 0;break;//只要max大于当前列中某值,剩余值即可不做比较。 if (flag) { printf("第%d行, 第%d列的 %d是鞍点\n", i, j, a[i][j]); flag = 1; } } } } if (!flag) printf("\n矩阵中无鞍点!\n"); system("pause"); }
例题2.有 N个数已按由小到大的顺序排好,要求输入一个数, 把它插入到原有序列中,而且仍然保持有序。//元素后移
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void main() { int arr[11] = { 1,2,3,4,5,7,8,9,10,11 }; int num = 6; for (int i = 0; i<10; i++) if (arr[i]>num) { for (int j = 10; j > i; j--) arr[j] = arr[j - 1]; arr[i] = num; break; } system("pause"); }
例题3.用选择法对10个整数由大到小排序。交换两个值 不用临时变量 a = a^b ; b = b^a; a = a^b
void SortSelect(int * arr, int num) { int i, j, max; for (i = 0; i<num - 1; i++) { max = i; for (j = i + 1; j<num; j++) if (arr[j]>arr[max]) max = j; if (i != max) { arr[max] ^= arr[i]; arr[i] ^= arr[max]; arr[max] ^= arr[i]; } } }
例题4.用筛选法求 2到 100之间的素数。方法如下:首先 2是素数,凡 2 的倍数都不是素数,于是把这些数从数表中筛去(置0), 2以后没有被筛去的第一个数是 3, 然后把 3的倍数都从数表中筛去, 3以后没被筛去的第一个数是 5,然后把 5 的倍数都从数表中筛去。如此下去,直到遇到某数 K(≤ N),其后没有数可筛选为止, 这时保留下的未被筛去的数就是 2到 N的素数。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void main() { int num = 100; int arr[100]; for (int i = 0; i < num; i++) arr[i] = i + 1; for (int i = 1; i < num; i++) for (int j = i + 1; j < num; j++)//j+1作为被除数 { if (arr[j] % (i + 1) == 0) arr[j] = 0;//非素数置零 } for (int i = 1, n = 0; i < num; i++) if (arr[i] != 0) { printf("%d ", arr[i]); if (++n % 10 == 0) printf("\n");//十个一组输出 } system("pause"); }
例题5.求一个 3×3矩阵两条对角线上元素之和(每个元素只加一次)。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void main() { int arr[3][3] = { 0 }; for (int i = 0; i<3; i++) for (int j = 0; j<3; j++) { arr[i][j] = rand() % 10; } int sum = 0; for (int i = 0; i<3; i++) for (int j = 0; j<3; j++) if (i == j || i + j == 2) { sum += arr[i][j]; } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%5d", arr[i][j]); } printf("\n"); } printf("对角线之和为%d\n", sum);
system("pause"); }
例题6.打印杨辉三角形
#include<stdio.h> #include<stdlib.h> void main() { int arr[10][10] = { 0 }; for (int i = 0; i<10; i++) { for (int j = 0; j <= i; j++) //第n行的数字有n项 { if (j == 0 || i == j) arr[i][j] = 1; else arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j]; //每个数等于它上方两数之和 printf("%6d", arr[i][j]); } printf("\n"); } system("pause"); }
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void printYanghui(int line) //用一维数组打印 { int i, j; int *data = (int *)malloc(line * sizeof(int));//动态创建数组 if (line == 1)//只打印一行 { printf("1\n"); } else if (line == 2)//只打印2行 { printf("1\n1\t1\n"); } else//打印三行以上 { data[0] = 1; data[1] = 1; data[2] = 1; printf("1\n1\t1\n"); for (i = 3; i<line + 1; i++)//第i行的数字个数为i { data[i - 1] = 1; for (j = i - 2; j>0; j--)//按照从倒数第二个数字开始重新计算data数组。否则从前面开始会覆盖掉前面的值 { data[j] = data[j - 1] + data[j]; } data[0] = 1; for (j = 0; j<i; j++) { printf("%d\t", data[j]); } printf("\n"); } } } int main( ) { int line = 0; printf("请输入行数N:"); scanf("%d", &line); printYanghui(line); system("pause"); }
例题7.将字符数组 A中下标为双号(0,2,4,6,8...) 的元素值传给另一个字符数组 B,然后将 B数组的元素按逆序输出。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> void main() { char *p = "abcdefgh"; char To[20]; unsigned i = 0, j = 0; while (i < strlen(p)) { To[j++] = *(p + i); i += 2; } To[j] = '\0'; while (j > 0) { printf("%2c", To[j - 1]); j--; } system("pause"); }
例题8.有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。 问此人原来的位置是多少号?约瑟夫环。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> void main() { int total = 17, need = 17, k = 3; int index = 0, count = 0, i = 0; int a[100] = { 0 }; for (;;) { index = index % total + 1; if (a[index] == 0) { i = (i + 1) % k; if (i == 0) { count++; a[index] = 1; } } if (count == need) break; } printf("index = %d\n", index); system("pause"); }