例题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:"); 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(" "); } 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是鞍点 ", i, j, a[i][j]); flag = 1; } } } } if (!flag) printf(" 矩阵中无鞍点! "); 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(" ");//十个一组输出 } 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(" "); } printf("对角线之和为%d ", 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(" "); } 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 "); } else if (line == 2)//只打印2行 { printf("1 1 1 "); } else//打印三行以上 { data[0] = 1; data[1] = 1; data[2] = 1; printf("1 1 1 "); 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 ", data[j]); } printf(" "); } } } 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] = '