This commit is contained in:
2026-06-15 09:00:38 +08:00
parent fec66377d5
commit 4640c5e02b
191 changed files with 6046 additions and 0 deletions
+58
View File
@@ -0,0 +1,58 @@
#include <stdio.h>
#define ITEM_COUNT 5
#define CAPACITY 6
int weights[ITEM_COUNT] = { 2, 3, 6, 5, 4 };
int values[ITEM_COUNT] = { 60, 30, 50, 40, 60 };
// 递推实现
void bag01Ditui() {
int f[CAPACITY + 1] = {0}; // 初始化数组
int taken[ITEM_COUNT][CAPACITY + 1] = {0}; // 用于记录物品放置状态
for (int i = 0; i < ITEM_COUNT; i++) {
int w = weights[i];
int v = values[i];
for (int j = CAPACITY; j >= w; j--) {
if (f[j] < f[j - w] + v) { // 如果放入当前物品后价值更高
f[j] = f[j - w] + v;
taken[i][j] = 1; // 标记当前物品被放入
}
}
}
printf("最大价值为: %d\n", f[CAPACITY]);
// 打印各物品的放置情况
printf("放入背包的物品: ");
for (int i = ITEM_COUNT - 1, j = CAPACITY; i >= 0; i--) {
if (taken[i][j]) {
printf("%d ", i + 1); // 输出物品编号 (1-based index)
j -= weights[i]; // 减去相应的重量
}
}
printf("\n");
}
// 递归实现
int bagProblem(int i, int j) {
if (i < 0) {
return 0;
}
int r = 0;
// 如果剩余空间大于或等于当前物品的重量
if (j >= weights[i]) {
// 放入当前物品的价值
int r1 = bagProblem(i - 1, j - weights[i]) + values[i];
// 不放入当前物品的价值
int r2 = bagProblem(i - 1, j);
r = (r1 > r2) ? r1 : r2;
} else {
r = bagProblem(i - 1, j);
}
return r;
}
int main() {
bag01Ditui();
printf("递归方式得到的最大价值为: %d\n", bagProblem(ITEM_COUNT - 1, CAPACITY));
return 0;
}
Binary file not shown.
+84
View File
@@ -0,0 +1,84 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_N 100
#define MAX_C 100
// 定义结构体以存储背包问题的相关数据
typedef struct {
int N; // 物体的个数
int C; // 背包的容量
int weight[MAX_N]; // 每个物体的重量
int value[MAX_N]; // 每个物体的价值
int DP[MAX_N][MAX_C]; // 动态规划表
} Bag;
void bag01NoRec(Bag* bag) {
// 初始化 DP 表
for (int j = 0; j <= bag->C; j++) {
bag->DP[0][j] = 0;
}
// 填充 DP 表
for (int i = 1; i <= bag->N; i++) {
for (int j = 0; j <= bag->C; j++) {
if (j >= bag->weight[i]) { // 如果容量为 j 的背包能够放下第 i 个物体
bag->DP[i][j] = (bag->DP[i - 1][j - bag->weight[i]] + bag->value[i] > bag->DP[i - 1][j]) ?
(bag->DP[i - 1][j - bag->weight[i]] + bag->value[i]) : bag->DP[i - 1][j];
} else {
// 物体放不下,仅选择不放该物体
bag->DP[i][j] = bag->DP[i - 1][j];
}
}
}
// 打印 DP 表
for (int i = 0; i <= bag->N; i++) {
for (int j = 0; j <= bag->C; j++) {
printf("%d ", bag->DP[i][j]);
}
printf("\n");
}
}
void printResult(Bag* bag, int n, int v) {
bool isAdd[MAX_N] = {false};
for (int i = n; i >= 1; i--) {
if (bag->DP[i][v] == bag->DP[i - 1][v])
isAdd[i] = false;
else {
isAdd[i] = true;
v -= bag->weight[i];
}
}
for (int i = 1; i <= n; i++) {
printf("%d号 %s; ", i, isAdd[i] ? "" : "不放");
}
printf("\n");
}
// 使用 init2 函数初始化,并测试背包算法
void init2(Bag* bag) {
bag->C = 6;
bag->weight[1] = 3;
bag->weight[2] = 2;
bag->weight[3] = 6;
bag->weight[4] = 5;
bag->weight[5] = 4;
bag->value[1] = 30;
bag->value[2] = 60;
bag->value[3] = 50;
bag->value[4] = 40;
bag->value[5] = 60;
bag->N = 5;
bag01NoRec(bag);
printResult(bag, bag->N, bag->C);
}
int main() {
Bag bag;
init2(&bag);
return 0;
}
+40
View File
@@ -0,0 +1,40 @@
#include <stdio.h>
#define ITEM_COUNT 5
#define CAPACITY 6
int weights[ITEM_COUNT + 1] = {0, 2, 3, 6, 5, 4}; // 物品重量,从1开始以匹配索引
int values[ITEM_COUNT + 1] = {0, 60, 30, 50, 40, 60}; // 物品价值,从1开始以匹配索引
int DP[ITEM_COUNT + 1][CAPACITY + 1] = {0}; // 动态规划数组
void bag01Ditui() {
for (int i = 1; i <= ITEM_COUNT; i++) {
for (int j = 0; j <= CAPACITY; j++) {
if (j >= weights[i]) {
DP[i][j] = (DP[i - 1][j] > DP[i - 1][j - weights[i]] + values[i])
? DP[i - 1][j]
: DP[i - 1][j - weights[i]] + values[i];
} else {
DP[i][j] = DP[i - 1][j];
}
}
}
}
void printResult(int n, int v) {
int isAdd[ITEM_COUNT + 1] = {0}; // 记录物品放置情况
for (int i = n; i >= 1; i--) {
if (DP[i][v] == DP[i - 1][v])
isAdd[i] = 0; // 不放此物品
else {
isAdd[i] = 1; // 放此物品
v -= weights[i]; // 减去相应的重量
}
}
for (int i = 1; i <= n; i++) {
printf(" %d号%s; ", i, isAdd[i] ? "" : "不放");
}
printf("\n");
}
int main() {
bag01Ditui(); // 计算动态规划数组
printf("最大价值为: %d\n", DP[ITEM_COUNT][CAPACITY]);
printResult(ITEM_COUNT, CAPACITY); // 打印物品放置情况
return 0;
}
Binary file not shown.
+43
View File
@@ -0,0 +1,43 @@
#include <stdio.h>
#include <stdlib.h>
void CreatYH(int n) {
// 创建一个n行n列的二维数组
int **arr = (int **)malloc(n * sizeof(int *));
for (int i = 0; i < n; i++) {
arr[i] = (int *)malloc(n * sizeof(int));
}
// 初始化数组元素值
for (int i = 0; i < n; i++) {
arr[i][0] = 1; // 第一列值
arr[i][i] = 1; // 斜边值
}
// 使用杨辉三角的填充规则
for (int i = 3; i <= n; i++) {
for (int j = 2; j < i; j++) {
arr[i - 1][j - 1] = arr[i - 2][j - 1] + arr[i - 2][j - 2]; // 赋值
}
// C语言不需要裁剪数组,因为定义了最大大小
}
// 输出数组
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
// 释放内存
for (int i = 0; i < n; i++) {
free(arr[i]); // 释放每一行
}
free(arr); // 释放数组指针
}
int main() {
CreatYH(5);
return 0;
}
Binary file not shown.
+27
View File
@@ -0,0 +1,27 @@
#include <stdio.h>
#define MAX_SIZE 10 // 定义最大大小,可以根据需要调整
void creatYH(int n) {
int arr[MAX_SIZE][MAX_SIZE] = {0}; // 初始化为 0
// 初始化数组元素值
for (int i = 0; i < n; i++) {
arr[i][0] = 1; // 第一列值
arr[i][i] = 1; // 斜边值
}
// 使用杨辉三角的填充规则
for (int i = 2; i < n; i++) { // 从第三行开始填充
for (int j = 1; j < i; j++) {
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j]; // 赋值
}
}
// 输出数组
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main() {
creatYH(5); // 调用函数打印杨辉三角的前5行
return 0;
}
Binary file not shown.
+48
View File
@@ -0,0 +1,48 @@
#include <stdio.h>
#include <limits.h> // 用于 INT_MAX
#define MAX_AMOUNT 100 // 定义最大金额
// 函数原型
int coinChange(int coins[], int numCoins, int amount);
int main() {
int coins[] = {1, 2, 5}; // 硬币面额数组
int amount = 29; // 目标金额
int numCoins = sizeof(coins) / sizeof(coins[0]); // 硬币数量
int result = coinChange(coins, numCoins, amount);
if (result != -1) {
printf("组成金额 %d 所需的最少硬币数为: %d\n", amount, result);
} else {
printf("无法组成金额 %d。\n", amount);
}
return 0;
}
int coinChange(int coins[], int numCoins, int amount) {
// 创建一个固定大小的数组来存储最少硬币数
int dp[MAX_AMOUNT + 1];
// 初始化 dp 数组
for (int i = 0; i <= MAX_AMOUNT; i++) {
dp[i] = INT_MAX; // 将每个值初始化为无穷大
}
dp[0] = 0; // 组成金额 0 所需的硬币数为 0
// 填充 dp 数组
for (int i = 1; i <= MAX_AMOUNT; i++) {
for (int j = 0; j < numCoins; j++) {
if (coins[j] <= i) {
// 更新 dp[i] 的值
if (dp[i - coins[j]] != INT_MAX) {
dp[i] = (dp[i] < dp[i - coins[j]] + 1) ? dp[i] : (dp[i - coins[j]] + 1);
}
}
}
}
// 返回结果
return (amount <= MAX_AMOUNT && dp[amount] != INT_MAX) ? dp[amount] : -1;
}
Binary file not shown.
+30
View File
@@ -0,0 +1,30 @@
#include <stdio.h>
#include <math.h>
int binaryLength1(int i) {
if (i == 0) return 1;
int k = 1;
i = i / 2;
while (i > 0) {
k++;
i = i / 2;
}
return k;
}
int binaryLength2(int n) {
if (n == 0) return 1;
return (int)(log2(n)) + 1;
}
int binaryLength3(int n) {
if (n == 0) return 1;
int length = 0;
while (n > 0) {
n >>= 1; // 右移一位,相当于除以2
length++;
}
return length;
}
int main(){
printf("%d\n",binaryLength1(8));
printf("%d\n",binaryLength2(8));
printf("%d\n",binaryLength3(8));
}
Binary file not shown.
+95
View File
@@ -0,0 +1,95 @@
#include <stdio.h>
#include <math.h>
#define N 9 // 定义数组大小为9
// 计算一个整数在二进制中需要的位数
int length(int i) {
int k = 1; // 初始化位数计数器
i = i / 2; // 将整数除以2,开始计算
while (i > 0) { // 当i大于0时继续
k++; // 每次循环位数增加1
i = i / 2; // 继续除以2
}
return k; // 返回计算得到的位数
}
void Compress(int n, int p[], int s[], int l[], int b[]) {
int Lmax = 256, header = 11; // 定义最大段数和头部长度
s[0] = 0; // 初始化s数组
for (int i = 0; i <= n; i++) { // 遍历每个元素
b[i] = length(p[i]); // 计算当前元素的位数
int bmax = b[i]; // 记录当前最大位数
s[i] = (i > 0 ? s[i - 1] : 0) + bmax + header; //当前段的最小存储长度
l[i] = 1; // 初始段数为1
for (int j = 2; j <= i + 1 && j <= Lmax; j++) { // 遍历可能的段数
if (bmax < length(p[i - j + 1])) { // 更新最大位数
bmax = length(p[i - j + 1]);
}
// 判断是否需要更新存储长度
if (s[i] > s[i - j] + j * bmax + header) {
s[i] = s[i - j] + j * bmax + header; // 更新最小存储长度
l[i] = j; // 更新段数
b[i] = bmax; // 更新位数
}
}
printf("组 %d: L = %d, B = %d, S = %d\n", i, l[i], b[i], s[i]);
}
}
// 追溯函数,恢复最优分段信息
int TraceBack(int n, int l[], int b[]) {
int i = 0;
int temp_l[N], temp_b[N]; // 临时数组存储分段信息
// 从最后一个元素向前追溯
while (n >= 0) {
temp_l[i] = l[n]; // 记录段数
temp_b[i] = b[n]; // 记录位数
n = n - l[n]; // 更新n,向前移动
i++; // 增加索引
}
// 反转数组,恢复正确顺序
for (int j = 0; j < i; j++) {
b[j] = temp_b[i - j - 1]; // 反向赋值位数
l[j] = temp_l[i - j - 1]; // 反向赋值段数
}
return i; // 返回段数
}
// 输出函数,展示最终结果
void Out(int m, int min_len, int l[], int b[], int p[]) {
printf("最小长度:%d\n", min_len); // 输出最小存储长度
printf("共分成:%d段\n", m); // 输出段数
int index = 0; // 初始化索引
for (int i = 0; i < m; i++) {
// 输出每段的信息
printf("第%d段含有%d元素. 需要存储位数%d,", i + 1, l[i], b[i]);
printf("元素值:");
// 输出当前段的元素值
for (int j = 0; j < l[i]; j++) {
printf("%d ", p[index++]); // 逐个输出元素
}
printf("\n"); // 换行
}
}
// 主函数,程序入口
int main() {
int p[] = {4, 6,5, 7, 129, 138, 1,2,3}; // 输入的灰度序列
int s[N] = {0}, l[N] = {0}, b[N] = {0}; // 初始化存储长度、段数和位数的数组
// 输出输入序列
printf("图像的灰度序列为:\n");
for (int i = 0; i < N; i++) {
printf("%d ", p[i]);
}
printf("\n");
// 调用压缩函数
Compress(N - 1, p, s, l, b);
int m = TraceBack(N - 1, l, b); // 调用追溯函数获取段数
Out(m, s[N - 1], l, b, p); // 输出结果
return 0;
}
Binary file not shown.
+107
View File
@@ -0,0 +1,107 @@
#include <stdio.h>
#include <math.h>
#define N 10 // 定义数组大小为10,包括占位符0
// 计算一个整数在二进制中需要的位数
int length(int i) {
int k = 1; // 初始化位数计数器
i = i / 2; // 将整数除以2,开始计算
while (i > 0) { // 当i大于0时继续
k++; // 每次循环位数增加1
i = i / 2; // 继续除以2
}
return k; // 返回计算得到的位数
}
// 压缩函数,计算最优分段
void Compress(int n, int p[], int s[], int l[], int b[]) {
int Lmax = 256, header = 11; // 定义最大段数和头部长度
s[0] = 0; // 初始化s数组
// 遍历实际数据,不包括第一个元素
for (int i = 1; i <= n; i++) {
b[i] = length(p[i]); // 计算当前元素的位数
int bmax = b[i]; // 记录当前最大位数
s[i] = (i > 1 ? s[i - 1] : 0) + bmax + header; // 计算当前段的最小存储长度
l[i] = 1; // 初始段数为1
printf("mid==%d\n",s[i]);
// 遍历可能的段数
for (int j = 2; j <= i && j <= Lmax; j++) {
// 更新最大位数
printf("bmax前**=%d",bmax);
if (bmax < length(p[i - j + 1])) {
bmax = length(p[i - j + 1]);
printf("bmax后**=%d",bmax);
}
// 判断是否需要更新存储长度
printf("\nmid=%d\n",s[i - j] + j * bmax + header);
if (s[i] > s[i - j] + j * bmax + header) {
s[i] = s[i - j] + j * bmax + header; // 更新最小存储长度
l[i] = j; // 更新段数
b[i] = bmax; // 更新位数
// printf("s[i]=%d,mid=%d\n",s[i],s[i - j] + j * bmax + header);
}
}
// 输出当前组的信息
printf("组 %d: L = %d, B = %d, S = %d\n", i, l[i], b[i], s[i]);
}
}
// 追溯函数,恢复最优分段信息
int TraceBack(int n, int l[], int b[]) {
int i = 0;
int temp_l[N], temp_b[N]; // 临时数组存储分段信息
// 从最后一个元素向前追溯
while (n >= 1) { // 只从1开始追溯,跳过0
temp_l[i] = l[n]; // 记录段数
temp_b[i] = b[n]; // 记录位数
n = n - l[n]; // 更新n,向前移动
i++; // 增加索引
}
// 反转数组,恢复正确顺序
for (int j = 0; j < i; j++) {
b[j] = temp_b[i - j - 1]; // 反向赋值位数
l[j] = temp_l[i - j - 1]; // 反向赋值段数
}
return i; // 返回段数
}
// 输出函数,展示最终结果
void Out(int m, int min_len, int l[], int b[], int p[]) {
printf("最小长度:%d\n", min_len); // 输出最小存储长度
printf("共分成:%d段\n", m); // 输出段数
int index = 1; // 从1开始,跳过0
for (int i = 0; i < m; i++) {
// 输出每段的信息
printf("第%d段含有%d元素. 需要存储位数%d,", i + 1, l[i], b[i]);
printf("元素值:");
// 输出当前段的元素值
for (int j = 0; j < l[i]; j++) {
printf("%d ", p[index++]); // 逐个输出元素,跳过第一个0
}
printf("\n"); // 换行
}
}
// 主函数,程序入口
int main() {
int p[] = {0, 4, 6, 5, 7, 129, 138, 1, 2, 3}; // 输入的灰度序列(加了0
int s[N] = {0}, l[N] = {0}, b[N] = {0}; // 初始化存储长度、段数和位数的数组
// 输出输入序列
printf("图像的灰度序列为:\n");
for (int i = 0; i < N; i++) {
printf("%d ", p[i]);
}
printf("\n");
// 调用压缩函数
Compress(N - 1, p, s, l, b);
int m = TraceBack(N - 1, l, b); // 调用追溯函数获取段数
Out(m, s[N - 1], l, b, p); // 输出结果
return 0;
}
Binary file not shown.
+88
View File
@@ -0,0 +1,88 @@
#include <stdio.h>
#include <string.h>
#define MAX 100
int getLCS(char* text1, char* text2) {
int t1_len = strlen(text1);
int t2_len = strlen(text2);
int dp[MAX][MAX] = {0};
for (int i = 1; i <= t1_len; i++) {
for (int j = 1; j <= t2_len; j++) {
if (text1[i - 1] == text2[j - 1]) {
//找到一个 lcs 的元素,继续往前找
dp[i][j] = 1 + dp[i - 1][j - 1];
} else {//谁能让 lcs 最长,就取谁的值
dp[i][j] = (dp[i - 1][j] > dp[i][j - 1])?
dp[i - 1][j] : dp[i][j - 1];
}
}
}
return dp[t1_len][t2_len];
}
void getLCSTable(int dp[MAX][MAX], char* text1, char* text2, char b[MAX][MAX]) {
int t1_len = strlen(text1);
int t2_len = strlen(text2);
for (int i = 1; i <= t1_len; i++) {
for (int j = 1; j <= t2_len; j++) {
if (text1[i - 1] == text2[j - 1]) {
dp[i][j] = 1 + dp[i - 1][j - 1];
b[i][j] = 'X'; // LCS元素,使用 'X' 作为占位符
} else if (dp[i - 1][j] >= dp[i][j - 1]) {
dp[i][j] = dp[i - 1][j];
b[i][j] = '|'; // 取上面的值
} else {
dp[i][j] = dp[i][j - 1];
b[i][j] = '-'; // 取左边的值
}
}
}
}
void printLCSTable(char b[MAX][MAX], char* t1, char* t2, int l1, int l2) {
printf("\t");
for (int j = 0; j < l2; j++)
printf("%c\t", t2[j]);
printf("\n");
for (int i = 0; i <= l1; i++) {
printf("%c\t", (i == 0) ? ' ' : t1[i - 1]);
for (int j = 0; j <= l2; j++) {
if (i == 0 && j == 0) {
printf("\t");
} else {
printf("%c\t", b[i][j]);
}
}
printf("\n");
}
}
void printLCSString(char b[MAX][MAX], char* x, int i, int j) {
if (i == 0 || j == 0) return;
if (b[i][j] == 'X') {
printLCSString(b, x, i - 1, j - 1);
// 打印当前字符
printf("%c", x[i - 1]);
} else if (b[i][j] == '|') {
printLCSString(b, x, i - 1, j);
} else {
printLCSString(b, x, i, j - 1);
}
}
int main() {
char t1[] = "ABCB";
char t2[] = "BDCA";
printf("字符串: %s 和字符串: %s 的 LCS 长度为: %d\n", t1, t2, getLCS(t1, t2));
printf("--------------------------------\n");
int dp[MAX][MAX] = {0};
char b[MAX][MAX] = {0};
getLCSTable(dp, t1, t2, b);
printLCSTable(b, t1, t2, strlen(t1), strlen(t2));
printf("-------------------------------\n");
printf("LCS 字符串为: ");
printLCSString(b, t1, strlen(t1), strlen(t2));
printf("\n");
return 0;
}
Binary file not shown.
+96
View File
@@ -0,0 +1,96 @@
#include <stdio.h>
#include <string.h>
// 打印LCS的函数
void PrintLCS(int path[][100], char *x, int i, int j) {
if (i == 0 || j == 0) {
return;
}
if (path[i][j] == 0) {
PrintLCS(path, x, i - 1, j - 1);
printf("%c", x[i - 1]);
} else if (path[i][j] == 1) {
PrintLCS(path, x, i - 1, j);
} else {
PrintLCS(path, x, i, j - 1);
}
}
// 找到LCS的长度
int findLCS(int dp[][100], char *A, int n, char *B, int m) {
// 初始化dp数组
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
dp[i][j] = 0; // 数组初始化
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) { // 执行状态转移方程
if (A[i - 1] == B[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = dp[i - 1][j] > dp[i][j - 1] ? dp[i - 1][j] : dp[i][j - 1];
}
}
}
return dp[n][m];
}
int main() {
char x[] = "w8xta2px0i1jf4jfn8du8dk1fk2kvchd32";
char y[] = "i3xsmdxwuv6a2yt520";
int m = strlen(x);
int n = strlen(y);
// 创建二维数组
int c[101][101]; // 101用于存储m+1和n+1的值
int path[101][101]; // 路径数组
// 初始化二维数组
for (int i = 0; i <= m; i++) {
c[i][0] = 0;
}
for (int i = 0; i <= n; i++) {
c[0][i] = 0;
}
// 实现LCS逻辑
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (x[i - 1] == y[j - 1]) {
c[i][j] = c[i - 1][j - 1] + 1;
} else if (c[i - 1][j] >= c[i][j - 1]) {
c[i][j] = c[i - 1][j];
path[i][j] = 1; // 来自上方
} else {
c[i][j] = c[i][j - 1];
path[i][j] = -1; // 来自左侧
}
}
}
// 输出c数组
printf("c:\n");
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
printf("%d\t", c[i][j]);
}
printf("\n");
}
// 输出path数组
printf("path:\n");
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
printf("%d\t", path[i][j]);
}
printf("\n");
}
printf("%s与%s的最长公共子序列为:\n", x, y);
PrintLCS(path, x, m, n);
return 0;
}
+29
View File
@@ -0,0 +1,29 @@
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 30 // 定义一个最大长度常量
int main() {
char s1[] = "abcdefg"; char s2[] = "cdefgh";
// 获取字符串的长度
int len1 = strlen(s1); int len2 = strlen(s2);
// 使用固定大小的数组
char s1_with_space[MAX_LENGTH]; char s2_with_space[MAX_LENGTH];
// 填充带空格的字符串
s1_with_space[0] = ' '; // 添加空格
strcpy(s1_with_space + 1, s1); // 复制原字符串到新字符串
s2_with_space[0] = ' '; // 添加空格
strcpy(s2_with_space + 1, s2); // 复制原字符串到新字符串
for (int i = 0; i <= len1; i++) { // 打印矩阵
for (int j = 0; j <= len2; j++) {
if (i == 0 && j <=len2) {
printf("%c\t", s2_with_space[j]); // 打印第二行的字符
} else if (j == 0 && i <= len1) {
printf("%c\t", s1_with_space[i]); // 打印第一列的字符
} else if (i > 0 && j > 0) {// 打印组合字符
printf("%c%c\t", s1_with_space[i], s2_with_space[j]);
}
}
printf("\n");
}
return 0;
}
Binary file not shown.
+50
View File
@@ -0,0 +1,50 @@
#include <stdio.h>
#include <time.h>
void doAddition(int iterations);
void doMultiplication(int iterations);
int main() {
const int iterations = 1000000000; // 操作次数
const int repetitions = 10; // 重复测试的次数
double totalAdditionTime = 0.0;
double totalMultiplicationTime = 0.0;
// 重复测试加法
for (int i = 0; i < repetitions; ++i) {
clock_t begin = clock();
doAddition(iterations);
clock_t end = clock();
totalAdditionTime += (double)(end - begin) / CLOCKS_PER_SEC;
}
printf("加法操作平均耗时: %.5f s\n", totalAdditionTime / repetitions);
// 重复测试乘法
for (int i = 0; i < repetitions; ++i) {
clock_t begin = clock();
doMultiplication(iterations);
clock_t end = clock();
totalMultiplicationTime += (double)(end - begin) / CLOCKS_PER_SEC;
}
printf("乘法操作平均耗时: %.5f s\n", totalMultiplicationTime / repetitions);
return 0;
}
// 加法函数
void doAddition(int iterations) {
long long result = 0; // 使用 long long 以避免溢出
for (int i = 0; i < iterations; ++i) {
result += 1; // 简单的加法操作
}
// printf("Addition result: %lld\n", result); // 可以取消注释以验证结果
}
// 乘法函数
void doMultiplication(int iterations) {
long long result = 1; // 使用 long long 以避免溢出
for (int i = 0; i < iterations; ++i) {
result *= 2; // 简单的乘法操作
}
// printf("Multiplication result: %lld\n", result); // 可以取消注释以验证结果
}
Binary file not shown.
+17
View File
@@ -0,0 +1,17 @@
#include <stdio.h>
void pringDuijiao(int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j || i + j == n - 1)
printf("*");
printf(" ");
}
printf("\n");
}
}
int main(){
pringDuijiao(9);
return 0;
}
Binary file not shown.
+39
View File
@@ -0,0 +1,39 @@
#include <stdio.h>
void trace(int i, int j, int s[][5]) {
if (i == j) {
printf("A%d", i);
} else {
printf("(");
trace(i, s[i][j], s); // 递归输出左边
trace(s[i][j] + 1, j, s); // 递归输出右边
printf(")");
}
}
int main() {
int wei[] = { 2, 3, 4, 5, 6 };
int s[5][5] = {
{0, 0, 0, 0, 0},
{0, 0, 1, 2, 2},
{0, 0, 0, 2, 2},
{0, 0, 0, 0, 3},
{0, 0, 0, 0, 0}
};
// 打印二维数组 s 的特定格式
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i == j || i + j == 4) // wei.length - 1 = 4
printf("%d", s[i][j]);
printf("\t");
}
printf("\n");
}
// 打印括号表示法
trace(1, 4, s); // wei.length - 1 = 4
printf("\n");
return 0;
}
Binary file not shown.
+45
View File
@@ -0,0 +1,45 @@
#include <stdio.h>
#include <limits.h>
void matrixChain(int p[], int m[][5], int s[][5], int n) {
for (int i = 1; i <= n; i++) {
m[i][i] = 0; // 初始化对角线
}
for (int d = 2; d <= n; d++) { // d为链的长度
for (int i = 1; i <= n - d + 1; i++) { // i是起始位置
int j = i + d - 1; // 结束位置
m[i][j] = INT_MAX; // 初始化为无穷大
for (int k = i; k < j; k++) {
// 计算当前划分的最小值
int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (t < m[i][j]) {
m[i][j] = t; // 更新最小值
s[i][j] = k; // 记录划分位置
}
}
}
}
}
//输出A[i,j]的最优计算次序
void traceback(int i, int j, int s[][5]) {
if (i == j) {
printf("A%d", i); // 输出矩阵名
} else {
printf("(");
traceback(i, s[i][j], s); // 递归输出左边
traceback(s[i][j] + 1, j, s); // 递归输出右边
printf(")");
}
}
int main() {
int p[] = {6, 7, 8, 9, 10}; // 矩阵的维数
int n = sizeof(p) / sizeof(p[0]) - 1; // 矩阵个数
int m[6][5] = {0}; // 存放最优值的数组
int s[6][5] = {0}; // 存放分割位置下标的数组
matrixChain(p, m, s, n);
printf("最优值为: %d\n", m[1][n]); // 输出最优值
printf("最优计算次序为: ");
traceback(1, n, s); // 输出最优计算次序
return 0;
}
Binary file not shown.
+26
View File
@@ -0,0 +1,26 @@
#include <stdio.h>
void printAi(int arr[], int i, int length) {
if (i < 1 || i >= length) {
printf("值不符合要求.\n");
} else {
printf("矩阵A%d的维数:%d行x%d列\n",
i, arr[i - 1], arr[i]);
for (int m = 0; m < arr[i - 1]; m++) {
for (int n = 0; n < arr[i]; n++) {
printf("0\t");
}
printf("\n");
}
}
}
int main() {
int arr[] = {2, 3, 4, 5, 6};
int length = sizeof(arr) / sizeof(arr[0]);
// 打印矩阵 A2 的维数
printAi(arr, 2, length);
return 0;
}
Binary file not shown.