1.(10分) 编程实现矩阵乘法(源文件命名matrix.c)。函数定义如下:
| int matmult (int a[][], int b[][]) { // 注意判断a、b维度可能不匹配,且可能是空矩阵 } |
- #include
-
- // 定义矩阵的最大维度
- #define MAX_ROWS 100
- #define MAX_COLS 100
-
- // 矩阵乘法函数
- int matmult(int a[][MAX_COLS], int b[][MAX_COLS], int c[][MAX_COLS], int rows_a, int cols_a,int rows_b, int cols_b) {
- if (cols_a != rows_b) {
- printf("矩阵维度不匹配,无法相乘。\n");
- return 0;
- }
-
- for (int i = 0; i < rows_a; i++) {
- for (int j = 0; j < cols_b; j++) {
- c[i][j] = 0;
- for (int k = 0; k < cols_a; k++) {
- c[i][j] += a[i][k] * b[k][j];
- }
- }
- }
-
- return 1; // 成功执行矩阵乘法
- }
- int main(){
- int rows_a, cols_a, rows_b, cols_b;
-
- printf("输入矩阵A的行数和列数:");
- scanf("%d %d",&rows_a, &cols_a);
-
- printf("输入矩阵B的行数和列数:");
- scanf("%d %d",&rows_b, &cols_b);
-
- // 检查是否为空矩阵
- if (cols_a == rows_a == 0 || cols_b == rows_b == 0){
- printf("输入为空矩阵。\n");
- return 1;
- }
-
- // 检查维度是否匹配
- if (cols_a != rows_b) {
- printf("矩阵维度不匹配,无法相乘。\n");
- return 1;
- }
-
- // 定义矩阵A,B和结果矩阵C
- int matrixA[MAX_ROWS][MAX_COLS];
- int matrixB[MAX_ROWS][MAX_COLS];
- int matrixC[MAX_ROWS][MAX_COLS];
-
- printf("输入矩阵A的元素:\n");
- for (int i = 0; i < rows_a; i++) {
- for (int j = 0; j < cols_a; j++) {
- scanf("%d", &matrixA[i][j]);
- }
- }
-
- printf("输入矩阵B的元素:\n");
- for (int i = 0; i < rows_b; i++) {
- for (int j = 0; j < cols_b; j++) {
- scanf("%d", &matrixB[i][j]);
- }
- }
-
- if (matmult(matrixA, matrixB, matrixC, rows_a, cols_a,rows_b, cols_b)) {
- printf("矩阵乘法的结果矩阵C为:\n");
- for (int i = 0; i < rows_a; i++) {
- for (int j = 0; j < cols_b; j++) {
- printf("%d ", matrixC[i][j]);
- }
- printf("\n");
- }
- }
-
- return 0;
- }
2. (10分) 编程实现二分查找(源文件命名binary_search.c)。函数定义如下:
| int b_search (int a[], int x) { // 注意判断a可能是空数组 } |
- #include
-
- int b_search(int a[], int x, int left, int right) {
- // 如果左边界大于右边界,说明目标元素不在数组中
- if (left > right) {
- return -1;
- }
-
- // 计算中间索引
- int mid = left + (right - left) / 2;
-
- // 如果中间元素等于目标元素,返回中间索引
- if (a[mid] == x) {
- return mid;
- }
-
- // 如果中间元素大于目标元素,在左半边继续搜索
- if (a[mid] > x) {
- return b_search(a, x, left, mid - 1);
- }
-
- // 否则,在右半边继续搜索
- return b_search(a, x, mid + 1, right);
- }
-
- int main() {
- int n , i = 0;
- printf("请输入数组中元素的个数:");
- scanf("%d",&n);
-
- if(n==0){//判断空数组
- printf("判断为空数组!");
- return 0;
- }
-
- int a[n];
- printf("请输入数组的元素:");
- for(i=0;i
- scanf("%d",&a[i]);
- }
- int x;
- printf("请输入你想要查找的数:");
- scanf("%d",&x);
-
- int result = b_search(a, x, 0, n - 1);
-
- if (result != -1) {
- printf("目标元素 %d 在数组中的索引位置是 %d\n", x, result);
- } else {
- printf("目标元素 %d 未在数组中找到\n", x);
- }
-
- return 0;
- }
3. (20分) 编程实现课件《绪论》中的“引例3”,需实现三种方法且进行比较(源文件命名search.c)。问题的输入是两个数组int a[], int x[],长度分别是n, m;输出int ans[]是一个取值+1或-1的数组,ans[i]=1代表x[i]在a[]中出现过,否则为-1。a[]和x[]数组中的元素自行随机生成(需调用C语言中的随机数生成库)。试生成不同量级的数组长度,比较三种方法的实际运行时间(需调用C语言中的计时库),完成下表:
n=100, m=100
n=103, m=103
n=105, m=105
n=108, m=108
方法一
(填程序的实际运行时间,如:0.2s)
(若太长可不记录)
方法二
方法三
- #include
- #include
- #include
-
- // 暴力寻找方法
- void brute_force_search(int a[], int x[], int ans[], int n, int m) {
- for (int i = 0; i < m; i++) {
- ans[i] = -1; // 初始化ans数组为-1
- for (int j = 0; j < n; j++) {
- if (x[i] == a[j]) {
- ans[i] = 1; // 如果找到x[i],将ans[i]设置为1
- break;
- }
- }
- }
- }
-
- // 二分查找方法
- int binary_search(int a[], int x, int left, int right) {
- if (left > right) {
- return -1;
- }
-
- int mid = left + (right - left) / 2;
-
- if (a[mid] == x) {
- return mid;
- } else if (a[mid] > x) {
- return binary_search(a, x, left, mid - 1);
- } else {
- return binary_search(a, x, mid + 1, right);
- }
- }
-
- // 使用哈希集方法
- void hash_set_search(int a[], int x[], int ans[], int n, int m) {
- // 创建哈希集合
- int max_element = 0; // 计算a数组中的最大元素
- for (int i = 0; i < n; i++) {
- if (a[i] > max_element) {
- max_element = a[i];
- }
- }
- int *hash_set = (int *)malloc((max_element + 1) * sizeof(int));
- if (hash_set == NULL) {
- fprintf(stderr, "内存分配失败\n");
- exit(1);
- }
-
- for (int i = 0; i < n; i++) {
- hash_set[a[i]] = 1;
- }
-
- for (int i = 0; i < m; i++) {
- ans[i] = hash_set[x[i]];
- }
-
- free(hash_set); // 释放哈希集合内存
- }
-
- int main() {
- // 随机数种子,用于初始化伪随机数生成器
- srand(time(NULL));
-
- int n = 100; // 数组a的长度
- int m = 100; // 数组x的长度
-
- // 创建数组a和x,并初始化为随机数
- int *a = (int *)malloc(n * sizeof(int));
- int *x = (int *)malloc(m * sizeof(int));
-
- if (a == NULL || x == NULL) {
- fprintf(stderr, "内存分配失败\n");
- return 1;
- }
-
- for (int i = 0; i < n; i++) {
- a[i] = rand() % 10000; // 随机生成0到9999之间的整数
- }
-
- for (int i = 0; i < m; i++) {
- x[i] = rand() % 10000; // 随机生成0到9999之间的整数
- }
-
- // 创建用于存储结果的数组ans
- int *ans = (int *)malloc(m * sizeof(int));
- if (ans == NULL) {
- fprintf(stderr, "内存分配失败\n");
- return 1;
- }
-
- // 测量暴力寻找方法的运行时间
- clock_t start_time = clock();
- brute_force_search(a, x, ans, n, m);
- clock_t end_time = clock();
-
- double elapsed_time = (double)(end_time - start_time) / CLOCKS_PER_SEC;
-
- printf("暴力寻找方法运行时间: %lf 秒\n", elapsed_time);
-
- // 清空ans数组
- for (int i = 0; i < m; i++) {
- ans[i] = -1;
- }
-
- // 测量二分查找方法的运行时间
- start_time = clock();
- for (int i = 0; i < m; i++) {
- int result = binary_search(a, x[i], 0, n - 1);
- if (result != -1) {
- ans[i] = 1;
- }
- }
- end_time = clock();
-
- elapsed_time = (double)(end_time - start_time) / CLOCKS_PER_SEC;
-
- printf("二分查找方法运行时间: %lf 秒\n", elapsed_time);
-
- // 清空ans数组
- for (int i = 0; i < m; i++) {
- ans[i] = -1;
- }
-
- // 测量使用哈希集方法的运行时间
- start_time = clock();
- hash_set_search(a, x, ans, n, m);
- end_time = clock();
-
- elapsed_time = (double)(end_time - start_time) / CLOCKS_PER_SEC;
-
- printf("使用哈希集方法运行时间: %lf 秒\n", elapsed_time);
-
- // 释放动态分配的内存
- free(a);
- free(x);
- free(ans);
-
- return 0;
- }