实验题辅导
一、实验题
(3)求一个3X3的整型矩阵对角线元素之和
#include <stdio.h>int main ()
{int a[3][3] = {1,2,3,4,5,6,7,8,9};int sum = 0;for(int i = 0; i < 3; i ++)sum += (a[i][i] + a[i][2-i]);sum -= a[1][1];printf("%d", sum);return 0;
}
(6)输出杨辉三角形的前十行
#include <stdio.h>int a[100][100];int main ()
{a[1][1] = 1;printf("%d\n", a[1][1]);for(int i = 2; i <= 10; i ++){for(int j = 1; j <= i; j ++){a[i][j] = a[i-1][j] + a[i-1][j-1];printf("%d ", a[i][j]);}printf("\n");}return 0;
}
(7)编一程序,将两个字符串连接起来,不要用strcat函数。
#include <stdio.h>
#include <string.h>int main ()
{char a[100], b[100];printf("请输入第一个字符串:\n");scanf("%s", a);printf("请输入第二个字符串:\n");scanf("%s", b);int n, m;n = strlen(a);m = strlen(b);for(int i = 0; b[i]!= '\0';i ++)a[n ++] = b[i];a[n] = '\0';printf("%s", a);return 0;
}
二、查找排序题
(1)合并排序
/*
1.递归分组
2.工具数组合并
3.重复合并步骤
*/
#include<stdio.h>
const int N = 1e6+10;
int n;
int q[N], tmp[N];
void merge_sort(int q[], int l, int r)
{//分组结束标志if(l >= r) return ;int mid = l + r >> 1;merge_sort(q, l, mid);merge_sort(q, mid+1, r);//合并过程int k = 0, i = l, j = mid + 1;while(i <= mid && j <= r){if(q[i] <= q[j])tmp[k ++] = q[i ++];else tmp[k ++] = q[j ++];}//合并剩下的数字while(i <= mid) tmp[k ++] = q[i ++]; //左边剩下while(j <= r) tmp[k ++] = q[j ++]; //右边剩下//还值for(i = l, j = 0; i <= r; i ++, j ++)q[i] = tmp[j];}int main()
{scanf("%d", &n);for(int i=0; i<n; i++)scanf("%d", &q[i]);merge_sort(q, 0, n-1);//printf("good\n");for(int i=0; i<n; i++)printf("%d ", q[i]);return 0;
}
(2)插入排序
#include <stdio.h>
int a[100];int main() {int n;scanf("%d", &n);for(int i = 0; i < n; i ++)scanf("%d", &a[i]);int i, j, key;// 插入排序for (i = 1; i < n; i++) {key = arr[i];j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}// 输出结果for (i = 0; i < n; i++)printf("%d ", arr[i]);return 0;
}
(3)折半查找
输出这个数字第一次出现的位置(第一个数字的位置为1)
#include<stdio.h>int main()
{int n, num; //数组大小,要查找的数字int a[100];scanf("%d%d", &n, &num);for(int i =1; i <=n; i ++)scanf("%d", &a[i]);int l = 1, r = n;while(l < r){int mid = (l + r)/2;if(a[mid] >= num) r = mid;else l= mid + 1;}if(a[l] != num)printf("没有找到这个数字");elseprintf("%d", l);return 0;
}
(4)插值查找
插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。查找效率可能比二分查找更高。
#include <stdio.h>// 插值查找(返回索引,-1表示未找到)
int interpolationSearch(int arr[], int n, int key) {int left = 0, right = n - 1;while (left <= right && key >= arr[left] && key <= arr[right]) {// 计算插值位置(避免溢出写法)int mid = left + (key - arr[left]) * (right - left) / (arr[right] - arr[left]);if (arr[mid] == key) return mid; // 找到目标else if (arr[mid] < key) left = mid + 1; // 目标在右侧else right = mid - 1; // 目标在左侧}return -1; // 未找到
}int main() {int arr[] = {10, 20, 30, 40, 50, 60, 70};int n = 7, key = 50;int index = interpolationSearch(arr, n, key);printf("元素 %d 的索引是:%d\n", key, index); // 输出:元素 50 的索引是:4return 0;
}
