commit fec66377d5b2458b74fd1e2aff213f1202546a3e Author: changjunqiang <344656718@qq.com> Date: Sun Jun 14 23:45:55 2026 +0800 first init diff --git a/c/.vscode/launch.json b/c/.vscode/launch.json new file mode 100644 index 0000000..bfbe696 --- /dev/null +++ b/c/.vscode/launch.json @@ -0,0 +1,31 @@ +{ + "configurations": [ + { + "name": "C/C++: gcc.exe 生成和调试活动文件", + "type": "cppdbg", + "request": "launch", + "program": "${fileDirname}\\${fileBasenameNoExtension}.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "C:\\msys64\\ucrt64\\bin\\gdb.exe", + "setupCommands": [ + { + "description": "为 gdb 启用整齐打印", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "将反汇编风格设置为 Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + } + ], + "preLaunchTask": "C/C++: gcc.exe 生成活动文件" + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/c/.vscode/settings.json b/c/.vscode/settings.json new file mode 100644 index 0000000..dd9b0c4 --- /dev/null +++ b/c/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "limits.h": "c" + }, + "C_Cpp.errorSquiggles": "disabled" +} \ No newline at end of file diff --git a/c/.vscode/tasks.json b/c/.vscode/tasks.json new file mode 100644 index 0000000..d891585 --- /dev/null +++ b/c/.vscode/tasks.json @@ -0,0 +1,28 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: gcc.exe 生成活动文件", + "command": "C:\\msys64\\ucrt64\\bin\\gcc.exe", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}\\${fileBasenameNoExtension}.exe" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "调试器生成的任务。" + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/c/ch1/compare.c b/c/ch1/compare.c new file mode 100644 index 0000000..742cab4 --- /dev/null +++ b/c/ch1/compare.c @@ -0,0 +1,21 @@ +#include +#include + +int main() { + long timea, timeb, timec;//clock_t timea; + long a = 1LL, b = 100000000LL; + long long result1 = 0LL, result2 = 0LL; + + timea = clock(); + for (long long i = a; i <= b; i++) { + result1 += i; + } + timeb = clock(); + printf("累加结果: %lld, 所用时间: %lf 毫秒\n", result1, (double)(timeb - timea) / CLOCKS_PER_SEC * 1000); + + result2 = (a + b) * (b - a + 1) / 2; + timec = clock(); + printf("高斯结果: %lld, 所用时间: %lf 毫秒\n", result2, (double)(timec - timeb) / CLOCKS_PER_SEC * 1000); + + return 0; +} diff --git a/c/ch1/compare.exe b/c/ch1/compare.exe new file mode 100644 index 0000000..e728035 Binary files /dev/null and b/c/ch1/compare.exe differ diff --git a/c/ch1/compareall.c b/c/ch1/compareall.c new file mode 100644 index 0000000..6a24466 --- /dev/null +++ b/c/ch1/compareall.c @@ -0,0 +1,33 @@ +#include +#include +// 函数声明 +long long sum_leijia(long long a, long long b); +long long sum_gaosi(long long a, long long b); + +int main() { + clock_t before, middle, after; + long long a = 1LL, b = 100000000LL; + long long result1 = 0LL, result2 = 0LL; + before = clock(); + result1 = sum_leijia(a, b); + middle = clock(); + printf("累加计算结果: %lld, 所用时间: %lf 毫秒\n", result1, (double)(middle - before) / CLOCKS_PER_SEC * 1000); + + // 计算公式方式的和并计时 + result2 = sum_gaosi(a, b); + after = clock(); + printf("高斯求和结果: %lld, 所用时间: %lf 毫秒\n", result2, (double)(after - middle) / CLOCKS_PER_SEC * 1000); + + return 0; +} +long long sum_leijia(long long a, long long b) { + long long sum = 0LL; + for (long long i = a; i <= b; i++) { + sum += i; + } + return sum; +} + +long long sum_gaosi(long long a, long long b) { + return (a + b) * (b - a + 1) / 2; +} diff --git a/c/ch1/first.c b/c/ch1/first.c new file mode 100644 index 0000000..cc063f7 --- /dev/null +++ b/c/ch1/first.c @@ -0,0 +1,16 @@ +#include +// row 表示当前要打印的行号(从1开始),n 表示总行数 +void printAt(int row, int n) { + if (row > n) + return; + for (int i = 0; i < row; i++) + printf("@"); + printf("\n"); // 打印完一行后换行 + printAt(row + 1, n); +} +int main() { + int n = 3; + printAt(1, n); + return 0; +} + diff --git a/c/ch1/first.exe b/c/ch1/first.exe new file mode 100644 index 0000000..9b54136 Binary files /dev/null and b/c/ch1/first.exe differ diff --git a/c/ch2/bigcheng/bigchengnew.c b/c/ch2/bigcheng/bigchengnew.c new file mode 100644 index 0000000..dd250e8 --- /dev/null +++ b/c/ch2/bigcheng/bigchengnew.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include +// 递归计算大整数乘积 +double bigdataride(long x, long y, int n) { + x = llabs(x); y = llabs(y); + if (n == 1) { + return (double)x * y; // 基本情况 + } else { + if (n % 2 == 1) n--; // 处理奇数位 + long halfPow = (long)pow(10, n / 2); + long a = x / halfPow; + long b = x % halfPow; + long c = y / halfPow; + long d = y % halfPow; + + // 递归计算 + double ac = bigdataride(a, c, n / 2); + double bd = bigdataride(b, d, n / 2); + long aJb = a + b; + long cJd = c + d; + double abcd = bigdataride(aJb, cJd, n / 2); + // 返回最终结果 + return ac * pow(10, n) + (abcd - ac - bd) * pow(10, n / 2) + bd; + } +} + +int main() { + long x = 8782346786879887887L; + long y = 4524387689998798768L; + // 计算数字长度 + char sx[20]; + snprintf(sx, sizeof(sx), "%ld", x); + int n = strlen(sx); + // 计算并输出结果 + double s = bigdataride(x, y, n); + printf("大数相乘的计算结果为:%lf\n", s); + + return 0; +} diff --git a/c/ch2/bigcheng/bigchengnew.exe b/c/ch2/bigcheng/bigchengnew.exe new file mode 100644 index 0000000..67e6aca Binary files /dev/null and b/c/ch2/bigcheng/bigchengnew.exe differ diff --git a/c/ch2/bigcheng/bigchengold.c b/c/ch2/bigcheng/bigchengold.c new file mode 100644 index 0000000..7e13e21 --- /dev/null +++ b/c/ch2/bigcheng/bigchengold.c @@ -0,0 +1,38 @@ +#include +#include +#define MAX_LEN 1000 +// 计算两个大整数的乘积 +void multiply(const char* a, const char* b, char* result) { + int lenA = strlen(a), lenB = strlen(b), lenResult = lenA + lenB; + int arr[MAX_LEN * 2] = {0}; + + // 进行乘法运算 + for (int i = 0; i < lenA; ++i) + for (int j = 0; j < lenB; ++j) + arr[i + j] += (a[lenA - i - 1] - '0') * (b[lenB - j - 1] - '0'); + // 处理进位 + for (int i = 0; i < lenResult - 1; ++i) { + arr[i + 1] += arr[i] / 10; + arr[i] %= 10; + } + // 构建结果字符串 + int index = 0; + while (index < lenResult && arr[index] == 0) ++index; + if (index == lenResult) strcpy(result, "0"); + else { + for (int i = index; i < lenResult; ++i) + result[i - index] = arr[lenResult - i - 1] + '0'; + result[lenResult - index] = '\0'; + } +} + +int main() { + char a[MAX_LEN + 1], b[MAX_LEN + 1], result[MAX_LEN * 2 + 1]; + printf("输入第一个大整数: "); + scanf("%s", a); + printf("输入第二个大整数: "); + scanf("%s", b); + multiply(a, b, result); + printf("结果: %s\n", result); + return 0; +} diff --git a/c/ch2/bigcheng/bigchengold.exe b/c/ch2/bigcheng/bigchengold.exe new file mode 100644 index 0000000..e35ffc8 Binary files /dev/null and b/c/ch2/bigcheng/bigchengold.exe differ diff --git a/c/ch2/ch2.allpai/allpai.c b/c/ch2/ch2.allpai/allpai.c new file mode 100644 index 0000000..6a72f3f --- /dev/null +++ b/c/ch2/ch2.allpai/allpai.c @@ -0,0 +1,30 @@ +#include +// 交换数组中两个指定位置的元素 +void swap(int arr[], int a, int b) { + int temp = arr[a]; + arr[a] = arr[b]; + arr[b] = temp; +} + +// 递归生成数组的所有排列 +void permutation(int arr[], int size, int n) { + if (n == size) {// 当排列到最后一个元素时,打印当前排列 + for (int i = 0; i < size; i++) { + printf("%d ", arr[i]); // 打印当前排列 + } + printf("\n"); // 换行 + } else {//将每个元素放在当前位置n,并递归排列剩下的元素 + for (int i = n; i < size; i++) { + swap(arr, i, n); // 交换第i和n个元素,固定第n个位置的元素 + permutation(arr, size, n + 1); // 递归处理下一个位置 + swap(arr, i, n); // 恢复原顺序,准备下一个交换 + } + } +} + +int main() { + int arr[] = {1,2,3, 4}; // 初始数组 + int size = sizeof(arr) / sizeof(arr[0]); + permutation(arr, size, 0); + return 0; +} diff --git a/c/ch2/ch2.allpai/allpai.exe b/c/ch2/ch2.allpai/allpai.exe new file mode 100644 index 0000000..f1e217b Binary files /dev/null and b/c/ch2/ch2.allpai/allpai.exe differ diff --git a/c/ch2/ch2.allpai/allpaichong.c b/c/ch2/ch2.allpai/allpaichong.c new file mode 100644 index 0000000..7aae9c9 --- /dev/null +++ b/c/ch2/ch2.allpai/allpaichong.c @@ -0,0 +1,65 @@ +#include +#include + +// 交换数组中两个指定位置的元素 +void swap(int arr[], int a, int b) +{ + int temp = arr[a]; + arr[a] = arr[b]; + arr[b] = temp; +} + +// 递归生成数组的所有排列,并排除重复的排列 +void permutation(int arr[], int size, int n) +{ + if (n == size) + { + for (int i = 0; i < size; i++) + { + printf("%d ", arr[i]); + } + printf("\n"); + } + else + { + bool used[100] = {false}; // 用于标记重复元素 + for (int i = n; i < size; i++) + { + if (!used[arr[i]]) + { // 检查当前元素是否已经被使用过 + used[arr[i]] = true; // 标记当前元素为已使用 + + swap(arr, i, n); // 交换第i和n个元素,固定第n个位置的元素 + permutation(arr, size, n + 1); // 递归处理下一个位置 + swap(arr, i, n); // 恢复原顺序,准备下一个交换 + } + } + + // for (int i = 0; i < 10; ++i) { + // printf("used[%d] = %s ", i, used[i] ? "true" : "false"); + // } + // printf("\n"); + } +} + +int main() +{ + int arr[] = {1, 2, 2, 3}; // 初始数组,包含重复元素 + int size = sizeof(arr) / sizeof(arr[0]); + + // 排序数组,以确保重复元素在一起 + // 这样处理后,重复元素会在相邻位置 + for (int i = 0; i < size - 1; i++) + { + for (int j = i + 1; j < size; j++) + { + if (arr[i] > arr[j]) + { + swap(arr, i, j); + } + } + } + + permutation(arr, size, 0); + return 0; +} diff --git a/c/ch2/ch2.allpai/allpaichong.exe b/c/ch2/ch2.allpai/allpaichong.exe new file mode 100644 index 0000000..350ffc4 Binary files /dev/null and b/c/ch2/ch2.allpai/allpaichong.exe differ diff --git a/c/ch2/ch2.allpai/arrpaichong.c b/c/ch2/ch2.allpai/arrpaichong.c new file mode 100644 index 0000000..994d50c --- /dev/null +++ b/c/ch2/ch2.allpai/arrpaichong.c @@ -0,0 +1,18 @@ +#include +#include + +#define SIZE 10 + +int main() { + int arr[SIZE] = {2, 5, 3, 5, 1, 2, 6, 7, 8, 9}; + bool used[SIZE] = {false}; // 用于标记数字是否已被使用 + + for (int i = 0; i < SIZE; ++i) { + if (!used[arr[i]]) { // 检查当前值是否已被使用 + printf("First occurrence of %d\n", arr[i]); + used[arr[i]] = true; // 标记该值为已使用 + } + } + + return 0; +} diff --git a/c/ch2/ch2.allpai/arrpaichong.exe b/c/ch2/ch2.allpai/arrpaichong.exe new file mode 100644 index 0000000..2e71320 Binary files /dev/null and b/c/ch2/ch2.allpai/arrpaichong.exe differ diff --git a/c/ch2/digui/printnumber.c b/c/ch2/digui/printnumber.c new file mode 100644 index 0000000..1704191 --- /dev/null +++ b/c/ch2/digui/printnumber.c @@ -0,0 +1,24 @@ +#include + +void printNumber2(int n) +{ + if (n > 9) + { + printNumber2(n / 10); + } + printf("%d", n % 10); +} + +int main() +{ + int number = 12345; // Example number + printNumber2(number); + printf("\n"); // Newline for better output formatting + + char *str = "abcde"; + printf("%s\n", str); // 输出: abcde + + char arr[] = "abcde"; + printf("%s\n", arr); // 输出: abcde + return 0; +} diff --git a/c/ch2/digui/printnumber.exe b/c/ch2/digui/printnumber.exe new file mode 100644 index 0000000..43d3a3c Binary files /dev/null and b/c/ch2/digui/printnumber.exe differ diff --git a/c/ch2/digui/tuxing.c b/c/ch2/digui/tuxing.c new file mode 100644 index 0000000..92b3cc0 --- /dev/null +++ b/c/ch2/digui/tuxing.c @@ -0,0 +1,16 @@ +#include +#include + +char* getStar(int n) { + if (n < 0) { + return "*"; + } else { + return getStar(n - 1); + } +} + +int main() { + int n = 5; + printf("%s\n", getStar(n)); + return 0; +} diff --git a/c/ch2/digui/tuxing.exe b/c/ch2/digui/tuxing.exe new file mode 100644 index 0000000..f3cc9ef Binary files /dev/null and b/c/ch2/digui/tuxing.exe differ diff --git a/c/ch2/halfsearch/fenzhi.c b/c/ch2/halfsearch/fenzhi.c new file mode 100644 index 0000000..e473869 --- /dev/null +++ b/c/ch2/halfsearch/fenzhi.c @@ -0,0 +1,28 @@ +#include + +int binarySearch(int a[], int size, int key) { + int left = 0; + int right = size - 1; + while (left <= right) { + int middle = (left + right) / 2; + if (key == a[middle]) + return middle; + else if (key > a[middle]) + left = middle + 1; + else + right = middle - 1; + } + return -1; +} + +int main() { + int a[] = {1, 3, 5, 7, 9}; + int size = sizeof(a) / sizeof(a[0]); + int key = 7; + int index = binarySearch(a, size, key); + if (index != -1) + printf("元素索引是 %d\n", index); + else + printf("没有找到\n"); + return 0; +} diff --git a/c/ch2/halfsearch/fenzhi.exe b/c/ch2/halfsearch/fenzhi.exe new file mode 100644 index 0000000..31caf7e Binary files /dev/null and b/c/ch2/halfsearch/fenzhi.exe differ diff --git a/c/ch2/halfsearch/fenzhirec.c b/c/ch2/halfsearch/fenzhirec.c new file mode 100644 index 0000000..c1a6163 --- /dev/null +++ b/c/ch2/halfsearch/fenzhirec.c @@ -0,0 +1,26 @@ +#include +int RecursionHalfSearch(int a[], int left, int right, int key) { + if (left <= right) { + int middle = (left + right) / 2; + if (key == a[middle]) + return middle; + else if (key > a[middle]) + return RecursionHalfSearch(a, middle + 1, right, key); + else + return RecursionHalfSearch(a, left, middle - 1, key); + } else { + return -1; + } +} + +int main() { + int a[] = {1, 3, 5, 7, 9}; + int size = sizeof(a) / sizeof(a[0]); + int key = 7; + int index = RecursionHalfSearch(a, 0, size - 1, key); + if (index != -1) + printf("Element found at index %d\n", index); + else + printf("Element not found\n"); + return 0; +} diff --git a/c/ch2/halfsearch/fenzhirec.exe b/c/ch2/halfsearch/fenzhirec.exe new file mode 100644 index 0000000..7ecf812 Binary files /dev/null and b/c/ch2/halfsearch/fenzhirec.exe differ diff --git a/c/ch2/juzhen/juzhennew.c b/c/ch2/juzhen/juzhennew.c new file mode 100644 index 0000000..7de5b45 --- /dev/null +++ b/c/ch2/juzhen/juzhennew.c @@ -0,0 +1,150 @@ +#include +#include +#include + +#define SIZE 4 // 矩阵的大小 + +// 检查一个数是否是2的幂次方 +bool isPowerOfTwo(int num) { + return (num & (num - 1)) == 0; +} + +// 矩阵加法 +void add(int* a, int* b, int* c, int length) { + for (int i = 0; i < length * length; i++) { + c[i] = a[i] + b[i]; + } +} + +// 获取结果矩阵 +void getResult(int* a, int* b, int* result) { + int p1 = a[0] * (b[1] - b[3]); + int p2 = (a[0] + a[1]) * b[3]; + int p3 = (a[2] + a[3]) * b[0]; + int p4 = a[3] * (b[2] - b[0]); + int p5 = (a[0] + a[3]) * (b[0] + b[3]); + int p6 = (a[1] - a[3]) * (b[2] + b[3]); + int p7 = (a[0] - a[2]) * (b[0] + b[1]); + + result[0] = p5 + p4 - p2 + p6; + result[1] = p1 + p2; + result[2] = p3 + p4; + result[3] = p5 + p1 - p3 - p7; +} + +// Strassen 矩阵乘法 +void sMM(int* a, int* b, int* result, int length) { + if (length == 2) { + getResult(a, b, result); + } else { + int tlength = length / 2; + int* aa = (int*)malloc(tlength * tlength * sizeof(int)); + int* ab = (int*)malloc(tlength * tlength * sizeof(int)); + int* ac = (int*)malloc(tlength * tlength * sizeof(int)); + int* ad = (int*)malloc(tlength * tlength * sizeof(int)); + int* ba = (int*)malloc(tlength * tlength * sizeof(int)); + int* bb = (int*)malloc(tlength * tlength * sizeof(int)); + int* bc = (int*)malloc(tlength * tlength * sizeof(int)); + int* bd = (int*)malloc(tlength * tlength * sizeof(int)); + int* t1 = (int*)malloc(tlength * tlength * sizeof(int)); + int* t2 = (int*)malloc(tlength * tlength * sizeof(int)); + int* t3 = (int*)malloc(tlength * tlength * sizeof(int)); + int* t4 = (int*)malloc(tlength * tlength * sizeof(int)); + int* temp = (int*)malloc(length * length * sizeof(int)); + + for (int i = 0; i < length; i++) { + for (int j = 0; j < length; j++) { + if (i < tlength) { + if (j < tlength) { + aa[i * tlength + j] = a[i * length + j]; + ba[i * tlength + j] = b[i * length + j]; + } else { + ab[i * tlength + (j - tlength)] = a[i * length + j]; + bb[i * tlength + (j - tlength)] = b[i * length + j]; + } + } else { + if (j < tlength) { + ac[(i - tlength) * tlength + j] = a[i * length + j]; + bc[(i - tlength) * tlength + j] = b[i * length + j]; + } else { + ad[(i - tlength) * tlength + (j - tlength)] = a[i * length + j]; + bd[(i - tlength) * tlength + (j - tlength)] = b[i * length + j]; + } + } + } + } + + int* t1_ = (int*)malloc(tlength * tlength * sizeof(int)); + int* t2_ = (int*)malloc(tlength * tlength * sizeof(int)); + int* t3_ = (int*)malloc(tlength * tlength * sizeof(int)); + int* t4_ = (int*)malloc(tlength * tlength * sizeof(int)); + + sMM(aa, ba, t1_, tlength); + sMM(ab, bc, t2_, tlength); + add(t1_, t2_, t1_, tlength); + + sMM(aa, bb, t2_, tlength); + sMM(ab, bd, t3_, tlength); + add(t2_, t3_, t2_, tlength); + + sMM(ac, ba, t3_, tlength); + sMM(ad, bc, t4_, tlength); + add(t3_, t4_, t3_, tlength); + + sMM(ac, bb, t4_, tlength); + sMM(ad, bd, t1_, tlength); + add(t4_, t1_, t4_, tlength); + + for (int i = 0; i < length; i++) { + for (int j = 0; j < length; j++) { + if (i < tlength) { + if (j < tlength) + result[i * length + j] = t1[i * tlength + j]; + else + result[i * length + j] = t2[i * tlength + (j - tlength)]; + } else { + if (j < tlength) + result[i * length + j] = t3[(i - tlength) * tlength + j]; + else + result[i * length + j] = t4[(i - tlength) * tlength + (j - tlength)]; + } + } + } + + free(aa); + free(ab); + free(ac); + free(ad); + free(ba); + free(bb); + free(bc); + free(bd); + free(t1_); + free(t2_); + free(t3_); + free(t4_); + free(temp); + } +} + +int main() { + int a[SIZE * SIZE] = { 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4 }; + int b[SIZE * SIZE] = { 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 }; + int c[SIZE * SIZE]; + + sMM(a, b, c, SIZE); + + for (int i = 0; i < SIZE * SIZE; i++) { + printf("%d ", c[i]); + if ((i + 1) % SIZE == 0) // 换行 + printf("\n"); + } + + printf("%d\n", isPowerOfTwo(1)); + printf("%d\n", isPowerOfTwo(2)); + printf("%d\n", isPowerOfTwo(4)); + printf("%d\n", isPowerOfTwo(6)); + printf("%d\n", isPowerOfTwo(443)); + + return 0; +} diff --git a/c/ch2/juzhen/juzhennew.exe b/c/ch2/juzhen/juzhennew.exe new file mode 100644 index 0000000..9aea552 Binary files /dev/null and b/c/ch2/juzhen/juzhennew.exe differ diff --git a/c/ch2/juzhen/juzhenold.c b/c/ch2/juzhen/juzhenold.c new file mode 100644 index 0000000..c8b38b6 --- /dev/null +++ b/c/ch2/juzhen/juzhenold.c @@ -0,0 +1,27 @@ +#include +#define SIZE 3 // 矩阵的大小 +int main() { + // 初始化矩阵 + int matrix1[SIZE][SIZE] = { { 1, 2, 3 }, { 3, 4, 5 }, { 3, 4, 5 } }; + int matrix2[SIZE][SIZE] = { { 4, 5, 6 }, { 6, 7, 8 }, { 6, 7, 8 } }; + int result[SIZE][SIZE] = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }; + int n = SIZE; int count = 0; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + result[i][j] = 0; + for (int k = 0; k < n; k++) { + result[i][j] += matrix1[i][k] * matrix2[k][j]; + count++; + } + } + } + // 输出结果 + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + printf("%d ", result[i][j]); + } + printf("\n"); + } + printf("N: %d, count: %d\n", n, count); + return 0; +} diff --git a/c/ch2/juzhen/juzhenold.exe b/c/ch2/juzhen/juzhenold.exe new file mode 100644 index 0000000..66f34a4 Binary files /dev/null and b/c/ch2/juzhen/juzhenold.exe differ diff --git a/c/ch2/maopao/mp.c b/c/ch2/maopao/mp.c new file mode 100644 index 0000000..4e411cc --- /dev/null +++ b/c/ch2/maopao/mp.c @@ -0,0 +1,36 @@ +#include +void printArray(int arr[], int size); // 函数声明 +void bubbleSort(int arr[], int n) { + for (int i = 0; i < n - 1; i++) { + for (int j = 0; j < n - i - 1; j++) { + if (arr[j] > arr[j + 1]) { + // 交换 arr[j] 和 arr[j + 1] + int temp = arr[j]; + arr[j] = arr[j + 1]; + arr[j + 1] = temp; + printArray(arr, n); + } + } + } +} + +void printArray(int arr[], int size) { + for (int i = 0; i < size; i++) { + printf("%d ", arr[i]); + } + printf("\n"); +} + +int main() { + int arr[] = {4, 2, 3, 1}; + int n = sizeof(arr) / sizeof(arr[0]); + + printf("原始数组: "); + printArray(arr, n); + + bubbleSort(arr, n); + + printf("排序后的数组: "); + printArray(arr, n); + return 0; +} diff --git a/c/ch2/maopao/mp.exe b/c/ch2/maopao/mp.exe new file mode 100644 index 0000000..bba8177 Binary files /dev/null and b/c/ch2/maopao/mp.exe differ diff --git a/c/ch2/matrix/macheng.c b/c/ch2/matrix/macheng.c new file mode 100644 index 0000000..74323ad --- /dev/null +++ b/c/ch2/matrix/macheng.c @@ -0,0 +1,94 @@ +#include +#include + +#define N 2 // 矩阵大小 + +void matrix_multiply(int A[][N], int B[][N], int C[][N]) +{ + int i, j, k; + if (N == 1) { + C[0][0] = A[0][0] * B[0][0]; + return; + } else { + int A11[N / 2][N / 2], A12[N / 2][N / 2], A21[N / 2][N / 2], A22[N / 2][N / 2]; + int B11[N / 2][N / 2], B12[N / 2][N / 2], B21[N / 2][N / 2], B22[N / 2][N / 2]; + int C11[N / 2][N / 2], C12[N / 2][N / 2], C21[N / 2][N / 2], C22[N / 2][N / 2]; + int P[N / 2][N / 2], Q[N / 2][N / 2], R[N / 2][N / 2], S[N / 2][N / 2], + T[N / 2][N / 2], U[N / 2][N / 2], V[N / 2][N / 2]; + // 将矩阵分成4个小矩阵 + for (i = 0; i < N / 2; i++) { + for (j = 0; j < N / 2; j++) { + A11[i][j] = A[i][j]; + A12[i][j] = A[i][j + N / 2]; + A21[i][j] = A[i + N / 2][j]; + A22[i][j] = A[i + N / 2][j + N / 2]; + B11[i][j] = B[i][j]; + B12[i][j] = B[i][j + N / 2]; + B21[i][j] = B[i + N / 2][j]; + B22[i][j] = B[i + N / 2][j + N / 2]; + } + } + // 求7个小矩阵 + matrix_multiply(A11, B11, P); + matrix_multiply(A12, B21, Q); + matrix_multiply(A11, B12, R); + matrix_multiply(A12, B22, S); + matrix_multiply(A21, B11, T); + matrix_multiply(A22, B21, U); + matrix_multiply(A21, B12, V); + + // 根据公式计算四个子矩阵 + for (i = 0; i < N / 2; i++) { + for (j = 0; j < N / 2; j++) { + C11[i][j] = P[i][j] + Q[i][j]; + C12[i][j] = R[i][j] + S[i][j]; + C21[i][j] = T[i][j] + U[i][j]; + C22[i][j] = V[i][j] + P[i][j] - R[i][j] + T[i][j]; + } + } + // 将四个子矩阵合并成一个大矩阵 + for (i = 0; i < N / 2; i++) { + for (j = 0; j < N / 2; j++) { + C[i][j] = C11[i][j]; + C[i][j + N / 2] = C12[i][j]; + C[i + N / 2][j] = C21[i][j]; + C[i + N / 2][j + N / 2] = C22[i][j]; + } + } + } +} + +int main() +{ + int A[N][N] = {{1, 2}, {3, 4}}; + int B[N][N] = {{5, 6}, {7, 8}}; + int C[N][N]; + int i, j; + + matrix_multiply(A, B, C); + + printf("矩阵A:\n"); + for (i = 0; i < N; i++) { + for (j = 0; j < N; j++) { + printf("%d ", A[i][j]); + } + printf("\n"); + } + + printf("矩阵B:\n"); + for (i = 0; i < N; i++) { + for (j = 0; j < N; j++) { + printf("%d ", B[i][j]); + } + printf("\n"); + } + + printf("矩阵C:\n"); + for (i = 0; i < N; i++) { + for (j = 0; j < N; j++) { + printf("%d ", C[i][j]); + } + printf("\n"); + } + return 0; +} \ No newline at end of file diff --git a/c/ch2/mergesort/guibing.c b/c/ch2/mergesort/guibing.c new file mode 100644 index 0000000..b4b5868 --- /dev/null +++ b/c/ch2/mergesort/guibing.c @@ -0,0 +1,57 @@ +#include + +// 归并函数 +void merge(int arr[], int left, int middle, int right, int temp[]) { + int i = left; // 左数组起始索引 + int j = middle + 1; // 右数组起始索引 + int k = left; // 合并后数组起始索引 + // 将数据复制到临时数组 + for (int m = left; m <= right; ++m) + temp[m] = arr[m]; + // 合并临时数组到 arr[left..right] + while (i <= middle && j <= right) { + if (temp[i] <= temp[j]) + arr[k++] = temp[i++]; + else + arr[k++] = temp[j++]; + } + // 拷贝剩余元素(如果有) + while (i <= middle) + arr[k++] = temp[i++]; +} + +// 归并排序函数 +void mergeSort(int arr[], int left, int right, int temp[]) { + if (left < right) { + int middle = left + (right - left) / 2; + mergeSort(arr, left, middle, temp); // 排序左半部分 + mergeSort(arr, middle + 1, right, temp); // 排序右半部分 + merge(arr, left, middle, right, temp); // 合并两个已排序的部分 + } +} + +// 打印数组 +void printArray(int arr[], int size) { + for (int i = 0; i < size; i++) { + printf("%d ", arr[i]); + } + printf("\n"); +} + +int main() { + int arr[] = {8, 7, 6, 15, 4, 3, 2, 10}; + int arrSize = sizeof(arr) / sizeof(arr[0]); + + // 定义临时数组 + int temp[arrSize]; + + printf("原始数组: "); + printArray(arr, arrSize); + + mergeSort(arr, 0, arrSize - 1, temp); + + printf("排序后的数组: "); + printArray(arr, arrSize); + + return 0; +} \ No newline at end of file diff --git a/c/ch2/mergesort/guibing.exe b/c/ch2/mergesort/guibing.exe new file mode 100644 index 0000000..1911f2e Binary files /dev/null and b/c/ch2/mergesort/guibing.exe differ diff --git a/c/ch2/mergesort/merge.c b/c/ch2/mergesort/merge.c new file mode 100644 index 0000000..195b321 --- /dev/null +++ b/c/ch2/mergesort/merge.c @@ -0,0 +1,64 @@ +#include +#include + +// 函数声明 +void merge(int arr[], int left, int middle, int right); +void mergeSort(int arr[], int left, int right); +void printArray(int arr[], int size); +// 归并函数 +void merge(int arr[], int left, int middle, int right) { + int i, j, k; + int n1 = middle - left + 1; + int n2 = right - middle; + // 创建临时数组 + int *L = (int *)malloc(n1 * sizeof(int)); + int *R = (int *)malloc(n2 * sizeof(int)); + // 拷贝数据到临时数组 L[] 和 R[] + for (i = 0; i < n1; i++) L[i] = arr[left + i]; + for (j = 0; j < n2; j++) R[j] = arr[middle + 1 + j]; + // 合并临时数组 + i = 0; // 初始索引 L + j = 0; // 初始索引 R + k = left; // 初始索引合并数组 + while (i < n1 && j < n2) { + if (L[i] <= R[j]) { arr[k] = L[i]; i++; + } else { arr[k] = R[j]; j++; } + k++; + } + while (i < n1) {// 拷贝 L[] 的剩余元素 + arr[k] = L[i]; i++; k++; + } + while (j < n2) { // 拷贝 R[] 的剩余元素 + arr[k] = R[j]; j++; k++; + } + free(L); free(R); // 释放临时数组内存 +} +// 归并排序函数 +void mergeSort(int arr[], int left, int right) { + if (left < right) { + //int middle = left + (right - left) / 2; + int middle = (left+right)/2; + mergeSort(arr, left, middle); // 递归调用归并排序 + mergeSort(arr, middle + 1, right); + merge(arr, left, middle, right); // 合并排序后的子数组 + } +} +// 打印数组 +void printArray(int arr[], int size) { + for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } + printf("\n"); +} +int main() { + int arr[] = {8, 7, 6, 15, 4, 3, 2, 10}; + int arrSize = sizeof(arr) / sizeof(arr[0]); + + printf("原始数组: "); + printArray(arr, arrSize); + + mergeSort(arr, 0, arrSize - 1); + + printf("排序后的数组: "); + printArray(arr, arrSize); + return 0; +} + diff --git a/c/ch2/mergesort/merge.exe b/c/ch2/mergesort/merge.exe new file mode 100644 index 0000000..f877a85 Binary files /dev/null and b/c/ch2/mergesort/merge.exe differ diff --git a/c/ch2/quicksort/danleft.c b/c/ch2/quicksort/danleft.c new file mode 100644 index 0000000..f52a2c6 --- /dev/null +++ b/c/ch2/quicksort/danleft.c @@ -0,0 +1,42 @@ +#include + +void quickSort(int arr[], int low, int high); +int getIndex(int arr[], int low, int high); + +void quickSort(int arr[], int low, int high) { + if (low < high) { + int index = getIndex(arr, low, high); // 找寻基准数据的正确索引 + quickSort(arr, low, index - 1); // 对左半段排序 + quickSort(arr, index + 1, high); // 对右半段排序 + } +} + +int getIndex(int arr[], int low, int high) { + int tmp = arr[low]; // 基准数据 + while (low < high) { + // 从左向右找到第一个大于基准的数据 + while (low < high && arr[low] <= tmp) { + low++; + } + arr[high] = arr[low]; // 将大于基准的数据移到右侧 + + // 从右向左找到第一个小于基准的数据 + while (low < high && arr[high] >= tmp) { + high--; + } + arr[low] = arr[high]; // 将小于基准的数据移到左侧 + } + arr[low] = tmp; // 将基准数据放到正确位置 + return low; // 返回基准数据的索引 +} + +int main() { + int arr[] = { 1, 5, 8, 2, 0, -1, 6 }; + int n = sizeof(arr) / sizeof(arr[0]); + quickSort(arr, 0, n - 1); + printf("排序后: "); + for (int i = 0; i < n; i++) + printf("%d ", arr[i]); + printf("\n"); + return 0; +} diff --git a/c/ch2/quicksort/danleft.exe b/c/ch2/quicksort/danleft.exe new file mode 100644 index 0000000..ca82c2a Binary files /dev/null and b/c/ch2/quicksort/danleft.exe differ diff --git a/c/ch2/quicksort/danppt.c b/c/ch2/quicksort/danppt.c new file mode 100644 index 0000000..9e731e5 --- /dev/null +++ b/c/ch2/quicksort/danppt.c @@ -0,0 +1,39 @@ +#include +void quickSort(int arr[], int low, int high); +int getIndex(int arr[], int low, int high); +void quickSort(int arr[], int low, int high) { + if (low < high) { + int index = getIndex(arr, low, high); // 找寻基准数据的正确索引 + quickSort(arr, low, index - 1); // 对左半段排序 + quickSort(arr, index + 1, high); // 对右半段排序 + } +} +int getIndex(int arr[], int low, int high) { + int pivot = arr[low]; // 基准数据 + int mark = low + 1; // mark 指针,从基准的下一个位置开始 + for (int i = mark; i <= high; i++) { + if (arr[i] < pivot) { // 如果当前元素小于基准元素 + // 交换 arr[i] 和 arr[mark] 的值 + int temp = arr[i]; + arr[i] = arr[mark]; + arr[mark] = temp; + mark++; // mark 指针右移 + } + } + // 最后将基准元素放到正确的位置 + arr[low] = arr[mark - 1]; + arr[mark - 1] = pivot; + return mark - 1; // 返回基准数据的索引 +} + +int main() { + int arr[] = {3, 5, 2, 6, 1, 4,-1,9,0}; + int n = sizeof(arr) / sizeof(arr[0]); + quickSort(arr, 0, n - 1); + + printf("排序后: "); + for (int i = 0; i < n; i++) + printf("%d ", arr[i]); + printf("\n"); + return 0; +} diff --git a/c/ch2/quicksort/danppt.exe b/c/ch2/quicksort/danppt.exe new file mode 100644 index 0000000..c056427 Binary files /dev/null and b/c/ch2/quicksort/danppt.exe differ diff --git a/c/ch2/quicksort/dantwo.c b/c/ch2/quicksort/dantwo.c new file mode 100644 index 0000000..0df3300 --- /dev/null +++ b/c/ch2/quicksort/dantwo.c @@ -0,0 +1,33 @@ +#include +void quickSort(int arr[], int low, int high); +int getIndex(int arr[], int low, int high); +void quickSort(int arr[], int low, int high) { + if (low < high) { + int index = getIndex(arr, low, high); // 找寻基准数据的正确索引 + quickSort(arr, low, index - 1); // 对左半段排序 + quickSort(arr, index + 1, high); // 对右半段排序 + } +} +int getIndex(int arr[], int low, int high) { + int pivot = arr[low]; // 基准数据 + while (low < high) { + // 从右边找到第一个小于基准的元素 + while (low < high && arr[high] >= pivot) { high--; } + arr[low] = arr[high]; // 将小于基准的数据移到左侧 + // 从左边找到第一个大于基准的元素 + while (low < high && arr[low] <= pivot) { low++; } + arr[high] = arr[low]; // 将大于基准的数据移到右侧 + } + arr[low] = pivot; // 将基准数据放到正确位置 + return low; // 返回基准数据的索引 +} +int main() { + int arr[] = { 3, 5, 2, 6}; + int n = sizeof(arr) / sizeof(arr[0]); + quickSort(arr, 0, n - 1); + printf("排序后: "); + for (int i = 0; i < n; i++) + printf("%d ", arr[i]); + printf("\n"); + return 0; +} \ No newline at end of file diff --git a/c/ch2/quicksort/shuangbian.c b/c/ch2/quicksort/shuangbian.c new file mode 100644 index 0000000..074308d --- /dev/null +++ b/c/ch2/quicksort/shuangbian.c @@ -0,0 +1,43 @@ +#include +void quicksort(int arr[], int low, int high) { + if (low < high) { + int pivot = arr[low]; // 选择基准元素 + int left = low + 1; + int right = high; + while (left <= right) { + // 从左侧查找大于基准的元素 + while (left <= high && arr[left] <= pivot) { left++; } + // 从右侧查找小于基准的元素 + while (right >= low && arr[right] > pivot) { right--; } + // 如果找到需要交换的元素 + if (left < right) { + int temp = arr[left]; arr[left] = arr[right]; + arr[right] = temp; + } + } + // 将基准元素放到合适的位置 + arr[low] = arr[right]; + arr[right] = pivot; + // 递归排序基准元素左侧和右侧的子数组 + quicksort(arr, low, right - 1); + quicksort(arr, right + 1, high); + } +} + +void printArray(int arr[], int size) { + for (int i = 0; i < size; i++) { + printf("%d ", arr[i]); + } + printf("\n"); +} + +int main() { + int arr[] = {10, 7, 8, 9, 1, 5}; + int n = sizeof(arr) / sizeof(arr[0]); + printf("原始数组: \n"); + printArray(arr, n); + quicksort(arr, 0, n - 1); + printf("排序后的数组: \n"); + printArray(arr, n); + return 0; +} diff --git a/c/ch2/quicksort/shuangbian.exe b/c/ch2/quicksort/shuangbian.exe new file mode 100644 index 0000000..4b1aa88 Binary files /dev/null and b/c/ch2/quicksort/shuangbian.exe differ diff --git a/c/ch2/richeng/bisan.c b/c/ch2/richeng/bisan.c new file mode 100644 index 0000000..37fc4c8 --- /dev/null +++ b/c/ch2/richeng/bisan.c @@ -0,0 +1,60 @@ +#include +#include + +void table(int k, int **a, int n); +void printTable(int **array, int n); + +void table(int k, int **a, int n) { + // 设置日程表第一行 + for (int i = 0; i < n; i++) { + a[i][0] = i + 1; // 第一列设置为选手序号 + } + // 填充表格 + for (int s = 0; s < k; s++) { + int half = 1 << s; // 2^s + for (int t = 0; t < (1 << (k - s - 1)); t++) { // 2^(k-s-1) + for (int i = 0; i < half; i++) { + for (int j = 0; j < half; j++) { + a[i + half * t][j + half * t] = a[i][j]; + a[i + half * t][j + half * t + half] = a[i][j + half]; + a[i + half * t + half][j + half * t] = a[i + half][j]; + a[i + half * t + half][j + half * t + half] = a[i + half][j + half]; + } + } + } + } +} + +void printTable(int **array, int n) { + // 打印表头 + printf("选手 | "); + for (int j = 1; j < n; j++) { printf("第%d天 | ", j); } + printf("\n"); + // 打印分隔行 + for (int j = 0; j <= n; j++) { printf("-----"); } + printf("\n"); + for (int i = 0; i < n; i++) { + printf("%2d | ", array[i][0]); // 打印选手序号 + for (int j = 1; j < n; j++) { printf("%2d | ", array[i][j]); } + printf("\n"); + } +} + +int main() { + int k = 3; // 2^3 = 8个运动员 + int n = 1 << k; // 计算2^k + // 创建二维数组作为日程表 + int **array = (int **)malloc(n * sizeof(int *)); + for (int i = 0; i < n; i++) { + array[i] = (int *)malloc(n * sizeof(int)); + for (int j = 0; j < n; j++) { // 确保初始化 + array[i][j] = 0; + } + } + table(k, array, n);// 制作日程表 + printTable(array, n);// 输出日程表 + // 释放动态分配的内存 + for (int i = 0; i < n; i++) { free(array[i]); } + free(array); + return 0; +} diff --git a/c/ch2/richeng/bisan.exe b/c/ch2/richeng/bisan.exe new file mode 100644 index 0000000..7324d39 Binary files /dev/null and b/c/ch2/richeng/bisan.exe differ diff --git a/c/ch2/shangji/findarrmax.c b/c/ch2/shangji/findarrmax.c new file mode 100644 index 0000000..b3c6003 --- /dev/null +++ b/c/ch2/shangji/findarrmax.c @@ -0,0 +1,26 @@ +#include + +// 递归函数来找最大值 +int findMax(int arr[], int size) { + if (size == 1) { + return arr[0]; + } + // 递归查找前 size-1 个元素的最大值, + //arr + 1 是指向数组中第二个元素的指针,即 arr[1] 的地址 + int maxOfRest = findMax(arr + 1, size - 1); + + // 返回当前第一个元素和递归结果中的较大者 + return (arr[0] > maxOfRest) ? arr[0] : maxOfRest; +} + +int main() { + int arr[] = {3, 5, 2, 8, 6, 7}; // 示例数组 + int size = sizeof(arr) / sizeof(arr[0]); + + // 调用递归函数,初始时数组的大小为 size + int max = findMax(arr, size); + + printf("数组中最大的值是:%d\n", max); + + return 0; +} diff --git a/c/ch2/shangji/findarrmax.exe b/c/ch2/shangji/findarrmax.exe new file mode 100644 index 0000000..2fb0442 Binary files /dev/null and b/c/ch2/shangji/findarrmax.exe differ diff --git a/c/ch2/shangji/sanjiao.c b/c/ch2/shangji/sanjiao.c new file mode 100644 index 0000000..8e12a63 --- /dev/null +++ b/c/ch2/shangji/sanjiao.c @@ -0,0 +1,20 @@ +#include + +// 定义递归打印三角形的函数 +void recursionSanjiao(int n) { + // 如果n大于等于0 + if (n >= 0) { + // 打印一行星号 + for (int i = 0; i < n; i++) { + printf("*"); + } + printf("\n"); // 换行 + recursionSanjiao(n - 1); // 递归调用,n减1 + } +} + +int main() { + int testValue = 5; // 可以改变这个值来测试不同的情况 + recursionSanjiao(testValue); + return 0; +} \ No newline at end of file diff --git a/c/ch2/shangji/sanjiao.exe b/c/ch2/shangji/sanjiao.exe new file mode 100644 index 0000000..8b12045 Binary files /dev/null and b/c/ch2/shangji/sanjiao.exe differ diff --git a/c/ch2/student/halfsearch.c b/c/ch2/student/halfsearch.c new file mode 100644 index 0000000..f041888 --- /dev/null +++ b/c/ch2/student/halfsearch.c @@ -0,0 +1,40 @@ +#include +void Search(int a[],int n,int x,int*i,int*j){ + int start=0,end=n-1; + *i=-1; + *j=-1; + while(start + +void Search(int a[], int n, int x, int *i, int *j) { + int start = 0, end = n - 1; + *i = -1; + *j = -1; + + while (start <= end) { + int mid = start + (end - start) / 2; + + if (a[mid] == x) { + *i = mid; // 找到目标元素 + *j = mid; // 初始化 *j + // 向左查找相同元素 + while (*i > 0 && a[*i - 1] == x) { + (*i)--; + } + // 向右查找相同元素 + while (*j < n - 1 && a[*j + 1] == x) { + (*j)++; + } + return; + } else if (a[mid] < x) { + start = mid + 1; + *i = mid; // 可能是小于 x 的最大元素 + } else { + end = mid - 1; + *j = mid; // 可能是大于 x 的最小元素 + } + } +} + +int main() { + int a[] = {2, 4, 6, 8, 9, 10, 12, 13}; + int x = 7; + int n = sizeof(a) / sizeof(a[0]); + int i, j; + + Search(a, n, x, &i, &j); + if (i == -1 && j == -1) { + printf("未找到%d的信息\n", x); + } else if (i == j) { + printf("目标元素%d位于%d\n", x, i); + } else { + printf("未找到目标元素%d的值\n", x); + printf("小于%d的最大元素位置%d\n", x, i); + printf("大于%d的最小元素位置%d\n", x, j); + } +} diff --git a/c/ch2/student/halfsearchnew.exe b/c/ch2/student/halfsearchnew.exe new file mode 100644 index 0000000..d7ec69f Binary files /dev/null and b/c/ch2/student/halfsearchnew.exe differ diff --git a/c/ch2/student/paichongright.c b/c/ch2/student/paichongright.c new file mode 100644 index 0000000..efb8d5b --- /dev/null +++ b/c/ch2/student/paichongright.c @@ -0,0 +1,61 @@ +#include +#include + +int bijiao(const void* a, const void* b) { + return (*(int*)a - *(int*)b); +} + +int used[100]; + +void dayi(int *arr, int n) { + for (int i = 0; i < n; i++) { + printf("%d ", arr[i]); // 添加空格以便于阅读 + } + printf("\n"); +} + +void pailie(int *arr, int start, int end) { + if (start == end) { + dayi(arr, end + 1); + } else { + for (int i = start; i <= end; i++) { + // 检查当前元素是否已经使用 + if (!used[i]) { + // 检查前一个元素是否相同且未被使用 + if (i > start && arr[i] == arr[i - 1] && !used[i - 1]) { + continue; // 跳过重复元素 + } + + used[i] = 1; + // 交换元素 + int t = arr[start]; + arr[start] = arr[i]; + arr[i] = t; + + pailie(arr, start + 1, end); + + // 交换回去 + t = arr[start]; + arr[start] = arr[i]; + arr[i] = t; + used[i] = 0; + } + } + } +} + +int main() { + int arr[] = {1, 2, 3, 4, 3, 6}; + int size = sizeof(arr) / sizeof(arr[0]); + + // 排序以方便后续去重 + qsort(arr, size, sizeof(int), bijiao); + + // 初始化使用标记数组 + for (int i = 0; i < size; i++) { + used[i] = 0; + } + + pailie(arr, 0, size - 1); + return 0; +} diff --git a/c/ch2/student/paichongright.exe b/c/ch2/student/paichongright.exe new file mode 100644 index 0000000..dde5f76 Binary files /dev/null and b/c/ch2/student/paichongright.exe differ diff --git a/c/ch2/student/ppp.c b/c/ch2/student/ppp.c new file mode 100644 index 0000000..db782a9 --- /dev/null +++ b/c/ch2/student/ppp.c @@ -0,0 +1,42 @@ + +#include"stdio.h" +#include"stdlib.h" +int bijiao(const void* a, const void*b){ + return (*(int*)a-*(int*)b); +} +int used[100]; +void dayi(int *arr,int n){ + for(int i=0;i maxOfRest) { + return arr[a]; // 返回当前元素值 + } else { + return maxOfRest; // 返回剩余部分的最大值 + } +} + +int main() { + int arr[] = {8, 1, 5, 9}; + int size = sizeof(arr) / sizeof(arr[0]); + int Max = findMax(arr, 0, size); // 获取最大值 + printf("最大元素是:%d\n", Max); + return 0; +} diff --git a/c/ch2/student/sanjiao.exe b/c/ch2/student/sanjiao.exe new file mode 100644 index 0000000..b5e8ca4 Binary files /dev/null and b/c/ch2/student/sanjiao.exe differ diff --git a/c/ch3/bag01/bag01.c b/c/ch3/bag01/bag01.c new file mode 100644 index 0000000..c2698c2 --- /dev/null +++ b/c/ch3/bag01/bag01.c @@ -0,0 +1,58 @@ +#include +#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; +} diff --git a/c/ch3/bag01/bag01.exe b/c/ch3/bag01/bag01.exe new file mode 100644 index 0000000..aafc2bc Binary files /dev/null and b/c/ch3/bag01/bag01.exe differ diff --git a/c/ch3/bag01/bagbag.c b/c/ch3/bag01/bagbag.c new file mode 100644 index 0000000..5e5ee71 --- /dev/null +++ b/c/ch3/bag01/bagbag.c @@ -0,0 +1,84 @@ +#include +#include +#include + +#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; +} diff --git a/c/ch3/bag01/bagevery.c b/c/ch3/bag01/bagevery.c new file mode 100644 index 0000000..1b4f867 --- /dev/null +++ b/c/ch3/bag01/bagevery.c @@ -0,0 +1,40 @@ +#include +#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; +} diff --git a/c/ch3/bag01/bagevery.exe b/c/ch3/bag01/bagevery.exe new file mode 100644 index 0000000..d07e54c Binary files /dev/null and b/c/ch3/bag01/bagevery.exe differ diff --git a/c/ch3/bag01/yanghui.c b/c/ch3/bag01/yanghui.c new file mode 100644 index 0000000..9947314 --- /dev/null +++ b/c/ch3/bag01/yanghui.c @@ -0,0 +1,43 @@ +#include +#include + +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; +} diff --git a/c/ch3/bag01/yanghui.exe b/c/ch3/bag01/yanghui.exe new file mode 100644 index 0000000..02f04ea Binary files /dev/null and b/c/ch3/bag01/yanghui.exe differ diff --git a/c/ch3/bag01/yanghuiarr.c b/c/ch3/bag01/yanghuiarr.c new file mode 100644 index 0000000..fe05d14 --- /dev/null +++ b/c/ch3/bag01/yanghuiarr.c @@ -0,0 +1,27 @@ +#include +#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; +} diff --git a/c/ch3/bag01/yanghuiarr.exe b/c/ch3/bag01/yanghuiarr.exe new file mode 100644 index 0000000..7c666d4 Binary files /dev/null and b/c/ch3/bag01/yanghuiarr.exe differ diff --git a/c/ch3/homework/lesscoin.c b/c/ch3/homework/lesscoin.c new file mode 100644 index 0000000..2871396 --- /dev/null +++ b/c/ch3/homework/lesscoin.c @@ -0,0 +1,48 @@ +#include +#include // 用于 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; +} diff --git a/c/ch3/homework/lesscoin.exe b/c/ch3/homework/lesscoin.exe new file mode 100644 index 0000000..78c93cf Binary files /dev/null and b/c/ch3/homework/lesscoin.exe differ diff --git a/c/ch3/image/get2Len.c b/c/ch3/image/get2Len.c new file mode 100644 index 0000000..4e5343d --- /dev/null +++ b/c/ch3/image/get2Len.c @@ -0,0 +1,30 @@ +#include +#include +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)); +} \ No newline at end of file diff --git a/c/ch3/image/get2Len.exe b/c/ch3/image/get2Len.exe new file mode 100644 index 0000000..357807d Binary files /dev/null and b/c/ch3/image/get2Len.exe differ diff --git a/c/ch3/image/imgcompress.c b/c/ch3/image/imgcompress.c new file mode 100644 index 0000000..425a0ec --- /dev/null +++ b/c/ch3/image/imgcompress.c @@ -0,0 +1,95 @@ +#include +#include + +#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; +} diff --git a/c/ch3/image/imgcompress.exe b/c/ch3/image/imgcompress.exe new file mode 100644 index 0000000..73786c4 Binary files /dev/null and b/c/ch3/image/imgcompress.exe differ diff --git a/c/ch3/image/imgcompress0.c b/c/ch3/image/imgcompress0.c new file mode 100644 index 0000000..025e92e --- /dev/null +++ b/c/ch3/image/imgcompress0.c @@ -0,0 +1,107 @@ +#include +#include + +#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; +} diff --git a/c/ch3/image/imgcompress0.exe b/c/ch3/image/imgcompress0.exe new file mode 100644 index 0000000..44e1dd5 Binary files /dev/null and b/c/ch3/image/imgcompress0.exe differ diff --git a/c/ch3/lcs/lcs1.c b/c/ch3/lcs/lcs1.c new file mode 100644 index 0000000..01b5ccf --- /dev/null +++ b/c/ch3/lcs/lcs1.c @@ -0,0 +1,88 @@ +#include +#include +#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; +} diff --git a/c/ch3/lcs/lcs1.exe b/c/ch3/lcs/lcs1.exe new file mode 100644 index 0000000..bb6749a Binary files /dev/null and b/c/ch3/lcs/lcs1.exe differ diff --git a/c/ch3/lcs/lcs2.c b/c/ch3/lcs/lcs2.c new file mode 100644 index 0000000..46c1a6d --- /dev/null +++ b/c/ch3/lcs/lcs2.c @@ -0,0 +1,96 @@ +#include +#include + + +// 打印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; +} \ No newline at end of file diff --git a/c/ch3/lcs/printtable.c b/c/ch3/lcs/printtable.c new file mode 100644 index 0000000..2a6e4d3 --- /dev/null +++ b/c/ch3/lcs/printtable.c @@ -0,0 +1,29 @@ +#include +#include + +#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; +} diff --git a/c/ch3/lcs/printtable.exe b/c/ch3/lcs/printtable.exe new file mode 100644 index 0000000..0648c4d Binary files /dev/null and b/c/ch3/lcs/printtable.exe differ diff --git a/c/ch3/matrix/chengJia.c b/c/ch3/matrix/chengJia.c new file mode 100644 index 0000000..2d57683 --- /dev/null +++ b/c/ch3/matrix/chengJia.c @@ -0,0 +1,50 @@ +#include +#include + +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); // 可以取消注释以验证结果 +} diff --git a/c/ch3/matrix/chengJia.exe b/c/ch3/matrix/chengJia.exe new file mode 100644 index 0000000..9a6ae96 Binary files /dev/null and b/c/ch3/matrix/chengJia.exe differ diff --git a/c/ch3/matrix/duijiaoxian.c b/c/ch3/matrix/duijiaoxian.c new file mode 100644 index 0000000..fc2c800 --- /dev/null +++ b/c/ch3/matrix/duijiaoxian.c @@ -0,0 +1,17 @@ +#include + +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; +} \ No newline at end of file diff --git a/c/ch3/matrix/duijiaoxian.exe b/c/ch3/matrix/duijiaoxian.exe new file mode 100644 index 0000000..6bd434c Binary files /dev/null and b/c/ch3/matrix/duijiaoxian.exe differ diff --git a/c/ch3/matrix/kuohao.c b/c/ch3/matrix/kuohao.c new file mode 100644 index 0000000..0aacb15 --- /dev/null +++ b/c/ch3/matrix/kuohao.c @@ -0,0 +1,39 @@ +#include + +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; +} diff --git a/c/ch3/matrix/kuohao.exe b/c/ch3/matrix/kuohao.exe new file mode 100644 index 0000000..9a2e35c Binary files /dev/null and b/c/ch3/matrix/kuohao.exe differ diff --git a/c/ch3/matrix/matrixmul.c b/c/ch3/matrix/matrixmul.c new file mode 100644 index 0000000..a2dae7f --- /dev/null +++ b/c/ch3/matrix/matrixmul.c @@ -0,0 +1,45 @@ +#include +#include +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; +} diff --git a/c/ch3/matrix/matrixmul.exe b/c/ch3/matrix/matrixmul.exe new file mode 100644 index 0000000..e70fc30 Binary files /dev/null and b/c/ch3/matrix/matrixmul.exe differ diff --git a/c/ch3/matrix/weishu.c b/c/ch3/matrix/weishu.c new file mode 100644 index 0000000..f8c5c2a --- /dev/null +++ b/c/ch3/matrix/weishu.c @@ -0,0 +1,26 @@ +#include + +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; +} diff --git a/c/ch3/matrix/weishu.exe b/c/ch3/matrix/weishu.exe new file mode 100644 index 0000000..86e4441 Binary files /dev/null and b/c/ch3/matrix/weishu.exe differ diff --git a/c/ch4/bag/tanbag.c b/c/ch4/bag/tanbag.c new file mode 100644 index 0000000..8d28541 --- /dev/null +++ b/c/ch4/bag/tanbag.c @@ -0,0 +1,42 @@ +#include +#define MAX_CAPACITY 150 +#define MAX_ITEMS 7 +typedef struct {// 物品结构体,包含重量、价值和性价比 + int weight; + int value; + double ratio; // 性价比 +} Item; +void sortItems(Item items[], int n) {// 计算性价比并进行排序 + for (int i = 0; i < n - 1; i++) { + for (int j = i + 1; j < n; j++) { + if (items[i].ratio < items[j].ratio) { + // 交换物品 + Item temp = items[i]; + items[i] = items[j]; + items[j] = temp; + } + } + } +} + +int main() { + // 初始化物品 + Item items[MAX_ITEMS] = { {35, 10, 0}, {30, 40, 0}, {60, 30, 0}, + {50, 50, 0}, {40, 35, 0}, {10, 40, 0}, {25, 30, 0} }; + for (int i = 0; i < MAX_ITEMS; i++) { // 计算性价比 + items[i].ratio = (double)items[i].value / items[i].weight; + } + sortItems(items, MAX_ITEMS);// 按性价比排序 + int capacity = MAX_CAPACITY; + int maxValue = 0; + printf("背包装入物品:\n"); // 装入背包 + for (int i = 0; i < MAX_ITEMS; i++) { + if (items[i].weight <= capacity) { + printf("重量为:%d的物品被选中了\n", items[i].weight); + maxValue += items[i].value; + capacity -= items[i].weight; + } + } + printf("最大价值为:%d\n", maxValue); + return 0; +} diff --git a/c/ch4/bag/tanbag.exe b/c/ch4/bag/tanbag.exe new file mode 100644 index 0000000..0194ef7 Binary files /dev/null and b/c/ch4/bag/tanbag.exe differ diff --git a/c/ch4/bag/tanbagtest.c b/c/ch4/bag/tanbagtest.c new file mode 100644 index 0000000..566ca4d --- /dev/null +++ b/c/ch4/bag/tanbagtest.c @@ -0,0 +1,42 @@ +#include +#define MAX_CAPACITY 15 +#define MAX_ITEMS 5 +typedef struct {// 物品结构体,包含重量、价值和性价比 + int weight; + int value; + double ratio; // 性价比 +} Item; +void sortItems(Item items[], int n) {// 计算性价比并进行排序 + for (int i = 0; i < n - 1; i++) { + for (int j = i + 1; j < n; j++) { + if (items[i].ratio < items[j].ratio) { + // 交换物品 + Item temp = items[i]; + items[i] = items[j]; + items[j] = temp; + } + } + } +} + +int main() { + // 初始化物品 + Item items[MAX_ITEMS] = { {10, 8, 0}, {2,1, 0}, {5, 6, 0}, + {5,3, 0}, {7, 7, 0} }; + for (int i = 0; i < MAX_ITEMS; i++) { // 计算性价比 + items[i].ratio = (double)items[i].value / items[i].weight; + } + sortItems(items, MAX_ITEMS);// 按性价比排序 + int capacity = MAX_CAPACITY; + int maxValue = 0; + printf("背包装入物品:\n"); // 装入背包 + for (int i = 0; i < MAX_ITEMS; i++) { + if (items[i].weight <= capacity) { + printf("重量为:%d的物品被选中了\n", items[i].weight); + maxValue += items[i].value; + capacity -= items[i].weight; + } + } + printf("最大价值为:%d\n", maxValue); + return 0; +} diff --git a/c/ch4/bag/tanbagtest.exe b/c/ch4/bag/tanbagtest.exe new file mode 100644 index 0000000..ad72600 Binary files /dev/null and b/c/ch4/bag/tanbagtest.exe differ diff --git a/c/ch4/bestload/loading.c b/c/ch4/bestload/loading.c new file mode 100644 index 0000000..65216bb --- /dev/null +++ b/c/ch4/bestload/loading.c @@ -0,0 +1,47 @@ +#include +#include +typedef struct { float weight; int index;} Element; +int compare(const void *a, const void *b) { + const Element *elemA = (const Element *)a; + const Element *elemB = (const Element *)b; + return (elemA->weight > elemB->weight) - (elemA->weight < elemB->weight); +} +// 最优装载函数 +float loading(float capacity, float weights[], int count, int x[]) { + Element *elements = malloc(count * sizeof(Element)); + for (int i = 0; i < count; i++) { // 初始化元素 + elements[i].weight = weights[i]; + elements[i].index = i; + } + qsort(elements, count, sizeof(Element), compare); // 排序元素 + // 初始化装载情况 + for (int i = 0; i < count; i++) { x[i] = 0; } + float totalWeight = 0; + // 贪心选择 + for (int i = 0; i < count && elements[i].weight <= capacity; i++) { + totalWeight += elements[i].weight; + capacity -= elements[i].weight; + x[elements[i].index] = 1; // 标记被装载的集装箱 + } + free(elements); // 释放动态分配的内存 + return totalWeight; +} +int main() { + float weights[] = {20, 30, 26, 15, 30, 40, 35,50,25}; + float capacity = 100; + int count = sizeof(weights) / sizeof(weights[0]); + int *x = malloc(count * sizeof(int)); + + float optimalWeight = loading(capacity, weights, count, x); + + printf("最优得到装载重量为:%.2f\n", optimalWeight); + printf("被装载的集装箱序号为(下标从0开始):"); + + for (int i = 0; i < count; i++) { + if (x[i] == 1) { + printf("%d ", i); + } + } + free(x); // 释放动态分配的内存 + return 0; +} diff --git a/c/ch4/bestload/loading.exe b/c/ch4/bestload/loading.exe new file mode 100644 index 0000000..7d5fba2 Binary files /dev/null and b/c/ch4/bestload/loading.exe differ diff --git a/c/ch4/bestload/sortAttr.c b/c/ch4/bestload/sortAttr.c new file mode 100644 index 0000000..6a1c749 --- /dev/null +++ b/c/ch4/bestload/sortAttr.c @@ -0,0 +1,23 @@ +#include +#include +typedef struct { + int age; +} CompareObj; + +// 比较函数,用于 qsort +int compare(const void *a, const void *b) { + CompareObj *objA = (CompareObj *)a; + CompareObj *objB = (CompareObj *)b; + return (objA->age - objB->age); // 按从小到大排序 +} +void printObj(CompareObj obj) { + printf("我的年龄:%d\n", obj.age); +} +int main() { + CompareObj objs[3]; // 初始化对象数组 + objs[0].age = 20; objs[1].age = 30; objs[2].age = 25; + qsort(objs, 3, sizeof(CompareObj), compare); + for (int i = 0; i < 3; i++) + printObj(objs[i]); + return 0; +} diff --git a/c/ch4/bestload/sortAttr.exe b/c/ch4/bestload/sortAttr.exe new file mode 100644 index 0000000..b6f6e30 Binary files /dev/null and b/c/ch4/bestload/sortAttr.exe differ diff --git a/c/ch4/huffman/halfall.c b/c/ch4/huffman/halfall.c new file mode 100644 index 0000000..62060ff --- /dev/null +++ b/c/ch4/huffman/halfall.c @@ -0,0 +1,224 @@ +#include +#include +#include + +#define MAX_TREE_HT 256 + +// 定义 Huffman 树的节点结构 +typedef struct Node { + int weight; // 节点的权重,即字符的频率 + char data; // 存储字符 + struct Node *left, *right; // 左右子节点 +} Node; + +// 比较函数,用于 qsort 按照权重排序 +int compare(const void* a, const void* b) { + return (*(Node**)a)->weight - (*(Node**)b)->weight; +} + +// 创建一个新的节点 +Node* newNode(char data, int weight) { + Node* temp = (Node*)malloc(sizeof(Node)); + temp->left = temp->right = NULL; + temp->data = data; + temp->weight = weight; + return temp; +} + +// 构建 Huffman 树 +Node* buildHuffmanTree(char data[], int weight[], int size) { + // 创建一个指向节点的数组 + Node** nodeArr = (Node**)malloc(size * sizeof(Node*)); + // 将每个字符及其权重转化为节点并存入数组 + for (int i = 0; i < size; ++i) { + nodeArr[i] = newNode(data[i], weight[i]); + } + // 使用 qsort 按照权重排序节点 + qsort(nodeArr, size, sizeof(Node*), compare); + // 构建 Huffman 树 + while (size > 1) { + // 取出两个最小的节点 + Node* left = nodeArr[0]; + Node* right = nodeArr[1]; + // 创建一个新的父节点,权重为两个子节点的权重之和 + Node* parent = newNode('\0', left->weight + right->weight); + parent->left = left; + parent->right = right; + // 将父节点插入到 heap 中 + nodeArr[0] = parent; + nodeArr[1] = nodeArr[size - 1]; // 将最后一个节点放到第二个位置 + size--; + // 重新排序数组 + qsort(nodeArr, size, sizeof(Node*), compare); + } + Node* root = nodeArr[0]; + free(nodeArr); + return root; +} + +// 打印 Huffman 编码 +void printHuffmanCodes(Node* root, int arr[], int top, char* codes[]) { + if (root->left) { + arr[top] = 0; + printHuffmanCodes(root->left, arr, top + 1, codes); + } + + if (root->right) { + arr[top] = 1; + printHuffmanCodes(root->right, arr, top + 1, codes); + } + + // 如果是叶节点,打印字符和对应的编码 + if (!root->left && !root->right) { + codes[root->data] = (char*)malloc((top + 1) * sizeof(char)); + if (!codes[root->data]) { + fprintf(stderr, "Memory allocation failed\n"); + exit(1); + } + for (int i = 0; i < top; ++i) + codes[root->data][i] = '0' + arr[i]; + codes[root->data][top] = '\0'; + printf("%c: %s\n", root->data, codes[root->data]); + } +} + +// 获取字符的 Huffman 编码 +const char* getHuffmanCode(Node* root, char ch, int arr[], int top, char* codes[]) { + if (codes[ch]) + return codes[ch]; + + if (root->left) { + arr[top] = 0; + const char* code = getHuffmanCode(root->left, ch, arr, top + 1, codes); + if (code) + return code; + } + + if (root->right) { + arr[top] = 1; + const char* code = getHuffmanCode(root->right, ch, arr, top + 1, codes); + if (code) + return code; + } + + // 如果是叶节点,检查是否是我们要找的字符 + if (!root->left && !root->right && root->data == ch) { + codes[root->data] = (char*)malloc((top + 1) * sizeof(char)); + if (!codes[root->data]) { + fprintf(stderr, "Memory allocation failed\n"); + exit(1); + } + for (int i = 0; i < top; ++i) + codes[root->data][i] = '0' + arr[i]; + codes[root->data][top] = '\0'; + return codes[root->data]; + } + + return NULL; +} + +// 编码函数:使用 Huffman 树编码文本 +void encode(Node* root, const char* str, char* encodedStr, char* codes[]) { + int arr[MAX_TREE_HT], top = 0; + printf("Huffman Codes:\n"); + printHuffmanCodes(root, arr, top, codes); + + printf("\nEncoded Text: "); + for (int i = 0; str[i] != '\0'; i++) { + const char* code = getHuffmanCode(root, str[i], arr, 0, codes); + if (code) { + printf("%s", code); + strcat(encodedStr, code); // 将每个字符的编码拼接到最终的编码字符串中 + } else { + fprintf(stderr, "Character '%c' not found in Huffman tree\n", str[i]); + exit(1); + } + } + printf("\n"); +} + +// 解码函数:从 Huffman 树解码编码文本 +void decode(Node* root, const char* encodedStr) { + Node* current = root; // 从根节点开始 + printf("\nDecoded Text: "); + + for (int i = 0; encodedStr[i] != '\0'; i++) { + // 根据编码字符串的每个字符决定树的遍历方向 + if (encodedStr[i] == '0') { + current = current->left; // 向左子节点移动 + } else if (encodedStr[i] == '1') { + current = current->right; // 向右子节点移动 + } + + // 如果到达叶节点,输出字符并返回根节点 + if (!current->left && !current->right) { + printf("%c", current->data); + current = root; // 重置为根节点,准备解码下一个字符 + } + } + printf("\n"); +} + +// 释放 Huffman 树的内存 +void freeHuffmanTree(Node* node) { + if (node == NULL) + return; + + freeHuffmanTree(node->left); + freeHuffmanTree(node->right); + free(node); +} + +// 释放 Huffman 编码的内存 +void freeHuffmanCodes(char* codes[]) { + for (int i = 0; i < 256; i++) { + if (codes[i]) { + free(codes[i]); + codes[i] = NULL; + } + } +} + +int main() { + const char* text = "hello huffman coding"; + + // 计算每个字符的频率 + int freq[256] = {0}; + for (int i = 0; text[i] != '\0'; i++) { + freq[(unsigned char)text[i]]++; + } + + // 构建字符和频率的数组 + char data[256]; + int frequencies[256]; + int size = 0; + for (int i = 0; i < 256; i++) { + if (freq[i] > 0) { + data[size] = (char)i; + frequencies[size] = freq[i]; + size++; + } + } + + // 构建 Huffman 树 + Node* root = buildHuffmanTree(data, frequencies, size); + + // 初始化 Huffman 编码数组 + char* codes[256] = {NULL}; + + // 编码 + char encodedText[MAX_TREE_HT * strlen(text)]; + memset(encodedText, 0, sizeof(encodedText)); + encode(root, text, encodedText, codes); + + // 解码 + decode(root, encodedText); + + // 释放 Huffman 树的内存 + freeHuffmanTree(root); + + // 释放 Huffman 编码的内存 + freeHuffmanCodes(codes); + + return 0; +} \ No newline at end of file diff --git a/c/ch4/huffman/halfall.exe b/c/ch4/huffman/halfall.exe new file mode 100644 index 0000000..297d251 Binary files /dev/null and b/c/ch4/huffman/halfall.exe differ diff --git a/c/ch4/huffman/halfcode.c b/c/ch4/huffman/halfcode.c new file mode 100644 index 0000000..2ff438c --- /dev/null +++ b/c/ch4/huffman/halfcode.c @@ -0,0 +1,100 @@ +#include +#include + +typedef struct Node { + int weight; + struct Node *left, *right; +} Node; + +// 比较函数用于 qsort +int compare(const void* a, const void* b) { + return (*(Node**)a)->weight - (*(Node**)b)->weight; +} + +// 创建新节点 +Node* createNode(int weight) { + Node* newNode = (Node*)malloc(sizeof(Node)); + newNode->weight = weight; + newNode->left = newNode->right = NULL; + return newNode; +} + +// 构建哈夫曼树 +Node* createHuffmanTree(int* weights, int size) { + Node** nodes = malloc(size * sizeof(Node*)); + for (int i = 0; i < size; i++) { + nodes[i] = createNode(weights[i]); + } + while (size > 1) { + qsort(nodes, size, sizeof(Node*), compare);// 排序节点数组 + // 创建父节点 + Node* parent = createNode(nodes[0]->weight + nodes[1]->weight); + parent->left = nodes[0]; + parent->right = nodes[1]; + + // 替换前两个最小节点 + nodes[0] = parent; + for (int i = 1; i < size - 1; i++) { + nodes[i] = nodes[i + 1]; + } + size--; + } + Node* root = nodes[0]; + free(nodes); + return root; +} + +// 递归生成哈夫曼编码 +void encode(Node* node, char* code, int depth) { + if (node->left == NULL && node->right == NULL) { + code[depth] = '\0';//终止字符串 + printf("权重: %d, 编码: %s\n", node->weight, code); + return; + } + code[depth] = '0'; + encode(node->left, code, depth + 1); + code[depth] = '1'; + encode(node->right, code, depth + 1); +} + +// 解码函数 +void decode(Node* root, const char* encoded) { + Node* current = root; + while (*encoded) { + if (*encoded == '0') { + current = current->left; + } else { + current = current->right; + } + // 到达叶子节点,打印权重并返回根节点 + if (current->left == NULL && current->right == NULL) { + printf("解码权重: %d\n", current->weight); + current = root; // 回到根节点 + } + encoded++;// 移动到下一个字符 + } +} +// 释放内存 +void freeTree(Node* node) { + if (node) { + freeTree(node->left); + freeTree(node->right); + free(node); + } +} + +int main() { + int weights[] = {2, 3, 7, 9, 18, 25}; + int size = sizeof(weights) / sizeof(weights[0]); + Node* root = createHuffmanTree(weights, size); + char code[100]; // 假设编码长度不会超过100 + printf("编码:\n"); + encode(root, code, 0); + + const char* encoded = "0010101111"; + printf("解码-0010101111:\n"); + decode(root, encoded); + + freeTree(root); + return 0; +} diff --git a/c/ch4/huffman/halfcode.exe b/c/ch4/huffman/halfcode.exe new file mode 100644 index 0000000..c74f9a2 Binary files /dev/null and b/c/ch4/huffman/halfcode.exe differ diff --git a/c/ch4/huffman/halftree.c b/c/ch4/huffman/halftree.c new file mode 100644 index 0000000..110aba0 --- /dev/null +++ b/c/ch4/huffman/halftree.c @@ -0,0 +1,91 @@ +#include +#include +typedef struct Node +{ + int weight; + struct Node *lChild; + struct Node *rChild; +} Node; + +// 比较函数,用于优先队列 +int compare(const void *a, const void *b) +{ + return (*(Node **)a)->weight - (*(Node **)b)->weight; +} + +// 创建新的节点 +Node *createNode(int weight) +{ + Node *newNode = (Node *)malloc(sizeof(Node)); + newNode->weight = weight; + newNode->lChild = NULL; + newNode->rChild = NULL; + return newNode; +} +// 构建哈夫曼树 +Node *createHuffman(int *weights, int size) +{ + Node **nodeArray = (Node **)malloc(size * sizeof(Node *)); + // 初始化节点数组 + for (int i = 0; i < size; i++) + { + nodeArray[i] = createNode(weights[i]); + printf("%d,", nodeArray[i]->weight); + } + qsort(nodeArray, size, sizeof(Node *), compare); + for (int i = 0; i < size; i++) + { + printf("%d-", nodeArray[i]->weight); + } + // 使用qsort实现优先队列 + for (int i = size; i > 1; i--) + { + qsort(nodeArray, i, sizeof(Node *), compare); + // 找到最右边两个节点 + Node *left = nodeArray[i - 1]; + Node *right = nodeArray[i - 2]; + // 创建新父节点 + Node *parent = createNode(left->weight + right->weight); + parent->lChild = left; + parent->rChild = right; + // 将新节点放入数组中 + nodeArray[i - 2] = parent; + } + + Node *root = nodeArray[0]; + free(nodeArray); + return root; +} +// 前序遍历输出 +void output(Node *head) +{ + if (head == NULL) + { + return; + } + printf("%d\n", head->weight); + output(head->lChild); + output(head->rChild); +} +// 释放树的内存 +void freeTree(Node *root) +{ + if (root == NULL) + { + return; + } + freeTree(root->lChild); + freeTree(root->rChild); + free(root); +} +int main() +{ + int weights[] = {2, 18, 9, 3, 7,25}; + int size = sizeof(weights) / sizeof(weights[0]); + Node *huffmanTree = createHuffman(weights, size); + printf("前序遍历halftree:\n"); + output(huffmanTree); + // 释放树的内存 + freeTree(huffmanTree); + return 0; +} diff --git a/c/ch4/huffman/halftree.exe b/c/ch4/huffman/halftree.exe new file mode 100644 index 0000000..8571f40 Binary files /dev/null and b/c/ch4/huffman/halftree.exe differ diff --git a/c/ch4/huffman/huffman_codes.txt b/c/ch4/huffman/huffman_codes.txt new file mode 100644 index 0000000..6cced59 --- /dev/null +++ b/c/ch4/huffman/huffman_codes.txt @@ -0,0 +1,10 @@ +f: 00 +n: 010 +m: 0110 +e: 0111 +h: 100 + : 1010 +a: 1011 +u: 1100 +o: 1101 +l: 111 diff --git a/c/ch4/huffman/treelist.c b/c/ch4/huffman/treelist.c new file mode 100644 index 0000000..a411013 --- /dev/null +++ b/c/ch4/huffman/treelist.c @@ -0,0 +1,51 @@ +#include +#include +typedef struct TreeNode { + int val; + struct TreeNode *left; + struct TreeNode *right; +} TreeNode; +TreeNode* createNode(int value) {// 创建新节点 + TreeNode *newNode = (TreeNode*)malloc(sizeof(TreeNode)); + newNode->val = value; + newNode->left = NULL; + newNode->right = NULL; + return newNode; +} +void preorderTraversal(TreeNode *root) { + if (root == NULL) return; + printf("%d ", root->val); // 访问根节点 + preorderTraversal(root->left); // 遍历左子树 + preorderTraversal(root->right); // 遍历右子树 +} +void inorderTraversal(TreeNode *root) { + if (root == NULL) return; + inorderTraversal(root->left); // 遍历左子树 + printf("%d ", root->val); // 访问根节点 + inorderTraversal(root->right); // 遍历右子树 +} +void postorderTraversal(TreeNode *root) { + if (root == NULL) return; + postorderTraversal(root->left); // 遍历左子树 + postorderTraversal(root->right); // 遍历右子树 + printf("%d ", root->val); // 访问根节点 +} +int main() { + // 创建二叉树 + TreeNode *root = createNode(1); + root->left = createNode(2); + root->right = createNode(3); + root->left->left = createNode(4); + root->left->right = createNode(5); + + printf("前序遍历: "); + preorderTraversal(root); + printf("\n"); + printf("中序遍历: "); + inorderTraversal(root); + printf("\n"); + printf("后序遍历: "); + postorderTraversal(root); + printf("\n"); + return 0; +} diff --git a/c/ch4/huffman/treelist.exe b/c/ch4/huffman/treelist.exe new file mode 100644 index 0000000..079c833 Binary files /dev/null and b/c/ch4/huffman/treelist.exe differ diff --git a/c/ch4/huodong/fenpei.c b/c/ch4/huodong/fenpei.c new file mode 100644 index 0000000..faff465 --- /dev/null +++ b/c/ch4/huodong/fenpei.c @@ -0,0 +1,35 @@ +#include +#include +int greedySelector(int s[], int f[], bool a[], int n) { + a[0] = true; // 安排第一个活动,标记为true + int j = 0; // 上一个被安排的活动的索引 + int count = 1; // 已安排活动的个数 + for (int i = 1; i < n; i++) { + // 检验当前最早结束的活动的开始时间是否晚于前一个活动的结束时间 + if (s[i] >= f[j]) { + a[i] = true; // 标记活动为已安排 + j = i; // 更新上一个活动的索引 + count++; // 记已安排活动的个数 + } else { + a[i] = false; // 标记活动为未安排 + } + } + return count; // 返回已安排活动的个数 +} +int main() { + // 初始化数据s数组记录活动开始时间;f数组记录活动结束时间 + int s[] = {1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12}; + int f[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; + int n = sizeof(s) / sizeof(s[0]); // 计算活动的个数 + bool a[n]; // boolean型数组,表示活动安排情况 + int result = greedySelector(s, f, a, n); + // 输出结果 + printf("选中的活动个数: %d\n", result); + for (int i = 0; i < n; i++) { + if (a[i]) { + printf("编号为:%d的活动被选中,", i + 1); + printf("其开始时间为:%d,结束时间为:%d\n", s[i], f[i]); + } + } + return 0; +} diff --git a/c/ch4/huodong/fenpei.exe b/c/ch4/huodong/fenpei.exe new file mode 100644 index 0000000..ab24988 Binary files /dev/null and b/c/ch4/huodong/fenpei.exe differ diff --git a/c/ch4/money/getmoney.c b/c/ch4/money/getmoney.c new file mode 100644 index 0000000..a281c46 --- /dev/null +++ b/c/ch4/money/getmoney.c @@ -0,0 +1,15 @@ +#include +int main() { + int money[] = {100, 50, 20, 10, 5, 1}; + int n = 85; + printf("要找的钱数为:%d\n", n); + int num[6] = {0}; // 存储每种面值所需的数量 + for (int i = 0; i < 6; i++) { + num[i] = n / money[i]; // 计算需要的面值数量 + n = n % money[i]; // 更新剩余的钱数 + } + for (int i = 0; i < 6; i++) { + printf("需要%d元面值%d枚\n", money[i], num[i]); + } + return 0; +} diff --git a/c/ch4/money/getmoney.exe b/c/ch4/money/getmoney.exe new file mode 100644 index 0000000..4776a26 Binary files /dev/null and b/c/ch4/money/getmoney.exe differ diff --git a/c/ch4/money/moneytwowei.c b/c/ch4/money/moneytwowei.c new file mode 100644 index 0000000..f65b067 --- /dev/null +++ b/c/ch4/money/moneytwowei.c @@ -0,0 +1,21 @@ +#include + +void makeGreedyChange(int m, int plan[][2], int size) { + for (int i = 0; i < size; i++) { + plan[i][1] += m / plan[i][0]; // 计算需要的面值数量 + m = m % plan[i][0]; // 更新剩余的钱数 + } +} +int main() { + int money = 90; + // 用一个二维数组 plan[6][2] 来存储每一种面值和其所对应的具体数目 + int plan[6][2] = { {50, 0}, {20, 0}, {10, 0}, {5, 0}, {2, 0}, {1, 0} }; + + makeGreedyChange(money, plan, 6); + + for (int i = 0; i < 6; i++) { + printf("%d元: %d张\n", plan[i][0], plan[i][1]); + } + + return 0; +} diff --git a/c/ch4/money/moneytwowei.exe b/c/ch4/money/moneytwowei.exe new file mode 100644 index 0000000..f37fc1e Binary files /dev/null and b/c/ch4/money/moneytwowei.exe differ diff --git a/c/ch4/shortest/path.c b/c/ch4/shortest/path.c new file mode 100644 index 0000000..106939a --- /dev/null +++ b/c/ch4/shortest/path.c @@ -0,0 +1,63 @@ +#include +#include +#include +#define MAX_NODES 5 +void dijkstra(int v, float a[MAX_NODES][MAX_NODES], + float dist[MAX_NODES], int prev[MAX_NODES]) { + int n = MAX_NODES; // 节点总数 + if (v < 0 || v >= n) { return; // 如果源节点不在有效范围内,返回 + } + bool s[MAX_NODES] = {false}; // 标记节点是否已确定最短路径 + for (int i = 0; i < n; i++) { // 初始化 + dist[i] = a[v][i]; s[i] = false; + if (dist[i] == FLT_MAX) { prev[i] = -1; // 如果没有路径,prev 设置为 -1 + } else { prev[i] = v; // 否则,前驱节点为源节点 + } + } + dist[v] = 0; // 源节点的距离是0 + s[v] = true; // 源节点加入已确定集合 + for (int i = 1; i < n; i++) { // Dijkstra 算法主体 + float temp = FLT_MAX; int u = v; + // 选择未访问的最短路径节点 + for (int j = 0; j < n; j++) { + if (!s[j] && dist[j] < temp) { + u = j; + temp = dist[j]; + } + } + s[u] = true; // 确定最短路径节点 u + // 更新与节点 u 相邻的节点的最短路径 + for (int j = 0; j < n; j++) { + if (!s[j] && a[u][j] < FLT_MAX) { + float newdist = dist[u] + a[u][j]; + if (newdist < dist[j]) { + dist[j] = newdist; + prev[j] = u; // 更新前驱节点 + } + } + } + } +} +int main() { + // 定义图的邻接矩阵 (FLT_MAX 表示没有路径) + float a[MAX_NODES][MAX_NODES] = { + {0, 8, 1, 2, FLT_MAX}, + {8, 0, FLT_MAX, 3, FLT_MAX}, + {1, FLT_MAX, 0, 2, 3}, + {2, 3, 2, 0, 3}, + {FLT_MAX, FLT_MAX, 3, 3, 0} + }; + float dist[MAX_NODES]; // 存储从源点到各个节点的最短距离 + int prev[MAX_NODES]; // 存储每个节点的前驱节点 + // 执行 Dijkstra 算法,从节点 0 开始 + dijkstra(0, a, dist, prev); + // 输出源点到其他节点的最短距离 + for (int i = 1; i < MAX_NODES; i++) { + if (dist[i] == FLT_MAX) { + printf("源点到%d没有路径\n", i); + } else { + printf("源点到%d的最短距离为:%.2f\n", i, dist[i]); + } + } + return 0; +} diff --git a/c/ch4/shortest/path.exe b/c/ch4/shortest/path.exe new file mode 100644 index 0000000..468495b Binary files /dev/null and b/c/ch4/shortest/path.exe differ diff --git a/c/ch4/shortest/shortpath.c b/c/ch4/shortest/shortpath.c new file mode 100644 index 0000000..61c9ee2 --- /dev/null +++ b/c/ch4/shortest/shortpath.c @@ -0,0 +1,61 @@ +#include +#include +#include + +void dijkstra(int n, int graph[n][n], int source, int dist[n], int parent[n], bool visited[n]) { + for (int i = 0; i < n; i++) { + dist[i] = INT_MAX; // 初始距离为无穷大 + parent[i] = -1; // 前驱节点初始化为 -1 + visited[i] = false; // 所有节点初始未访问 + } + dist[source] = 0; // 源节点的距离为 0 + for (int i = 0; i < n - 1; i++) {// 寻找未访问的最小距离节点 + int u = -1; + for (int j = 0; j < n; j++) { + if (!visited[j] && (u == -1 || dist[j] < dist[u])) { + u = j; + } + } + visited[u] = true;// 标记节点 u 为已访问 + // 更新与节点 u 相邻的未访问节点的最短路径 + for (int v = 0; v < n; v++) { + if (graph[u][v] != INT_MAX && dist[u] + graph[u][v] < dist[v]) { + dist[v] = dist[u] + graph[u][v]; + parent[v] = u; // 更新前驱节点 + } + } + } +} +void printPath(int parent[], int node) { + if (node == -1) return; // 终止条件 + printPath(parent, parent[node]); // 递归打印前驱节点 + printf("%d ", node); // 打印当前节点 +} +// 主函数 +int main() { + int n = 5; + int graph[5][5] = { // 邻接矩阵表示图 + {0, 10, INT_MAX, INT_MAX, 5}, + {10, 0, 1, INT_MAX, INT_MAX}, + {INT_MAX, 1, 0, 3, INT_MAX}, + {INT_MAX, INT_MAX, 3, 0, 8}, + {5, INT_MAX, INT_MAX, 8, 0} + }; + int source = 0; // 设定源节点为 0 + int dist[n]; // 存储到每个节点的最短距离 + int parent[n]; // 存储每个节点的前驱节点 + bool visited[n]; // 标记节点是否已经访问 + // 运行 Dijkstra 算法 + dijkstra(n, graph, source, dist, parent, visited); + // 输出最短路径结果 + for (int i = 1; i < n; i++) { + if (dist[i] == INT_MAX) { + printf("到点 %d 不可直达.\n", i); + } else { + printf("源点到%d的最短路径是 %d,路径为: ", i, dist[i]); + printPath(parent, i); // 打印路径 + printf("\n"); + } + } + return 0; +} diff --git a/c/ch4/shortest/shortpath.exe b/c/ch4/shortest/shortpath.exe new file mode 100644 index 0000000..4e2b020 Binary files /dev/null and b/c/ch4/shortest/shortpath.exe differ diff --git a/c/ch5/hui01bag/huisu01bag.c b/c/ch5/hui01bag/huisu01bag.c new file mode 100644 index 0000000..873cb3d --- /dev/null +++ b/c/ch5/hui01bag/huisu01bag.c @@ -0,0 +1,51 @@ +#include +#include +typedef struct Goods{ + int weight; + int value; +} Goods; +int getSurplusValue(Goods *goodArr, int n, int i) { + int surplusValue = 0; + for (int j = i; j < n; j++) + surplusValue += goodArr[j].value; + return surplusValue; +} +int dfs(Goods *goodArr, int n, int totalWeight, int *way, int *bestWay, + int i, int currWeight, int currValue, int bestValue) { + if (i >= n) { + bestValue = currValue; + for (int k = 0; k < n; k++) + bestWay[k] = way[k]; + return bestValue; + } + // 搜索左子树 + if (currWeight + goodArr[i].weight <= totalWeight) { + currWeight += goodArr[i].weight; + currValue += goodArr[i].value; + way[i] = 1; + bestValue = dfs(goodArr, n, totalWeight, way, bestWay, i + 1, + currWeight, currValue, bestValue); + currWeight -= goodArr[i].weight; + currValue -= goodArr[i].value; + way[i] = 0; + } + // 搜索右子树 + if (currValue + getSurplusValue(goodArr, n, i + 1) >= bestValue) { + bestValue = dfs(goodArr, n, totalWeight, way, bestWay, i + 1, + currWeight, currValue, bestValue); + } + return bestValue; +} +int main() { + Goods goodArr[] = { {1, 5}, {2, 6}, {3, 7}, {4, 8} }; + int totalWeight = 8; + int n = sizeof(goodArr) / sizeof(goodArr[0]); + int way[n], bestWay[n]; + int bestValue = 0; + bestValue = dfs(goodArr, n, totalWeight, way, bestWay, 0, 0, 0, bestValue); + printf("最大价值可为: %d\n", bestValue); + printf("各包的取舍状态为:\n"); + for (int i = 0; i < n; i++) + printf("重量为: %d 的: %d\n", goodArr[i].weight, bestWay[i]); + return 0; +} diff --git a/c/ch5/hui01bag/huisu01bag.exe b/c/ch5/hui01bag/huisu01bag.exe new file mode 100644 index 0000000..0c8a1d6 Binary files /dev/null and b/c/ch5/hui01bag/huisu01bag.exe differ diff --git a/c/ch5/loading/huiloading.c b/c/ch5/loading/huiloading.c new file mode 100644 index 0000000..a9c14d1 --- /dev/null +++ b/c/ch5/loading/huiloading.c @@ -0,0 +1,55 @@ +#include +#define MAX_N 100 // 最大集装箱数量 +int n; // 集装箱数 +int boxArr[MAX_N]; // 集装箱重量数组 +int C1; // 第一艘轮船的载重量 +int currWeight = 0; // 当前载重量 +int bestWeight = 0; // 当前最优载重量 +int leftWeight = 0; // 剩余集装箱重量 +int x[MAX_N]; // 装入数组 当前解 +int bestx[MAX_N]; // 最佳装入数组 当前最优解 +void backtrace(int i) {// 回溯算法 + // 1. 到达叶节点 + if (i >= n) { // i此时的值=叶节点+1 + if (currWeight > bestWeight) { + for (int j = 0; j < n; j++) + bestx[j] = x[j]; + bestWeight = currWeight; + } + return; + } + leftWeight -= boxArr[i]; + // 2. 搜索左子树 + if (currWeight + boxArr[i] <= C1) { // x[i] = 1 + x[i] = 1; + currWeight += boxArr[i]; + backtrace(i + 1); + currWeight -= boxArr[i]; + } + // 3. 搜索右子树 + if (currWeight + leftWeight > bestWeight) { + x[i] = 0; + backtrace(i + 1); + } + leftWeight += boxArr[i]; +} +int main() { + // 初始化集装箱信息 + int boxes[] = {4, 5, 6}; + n = sizeof(boxes) / sizeof(boxes[0]); // 货物数量 + C1 = 10; // 第一艘轮船的载重量 + // 设置集装箱重量 + for (int i = 0; i < n; i++) { + boxArr[i] = boxes[i]; + leftWeight += boxArr[i]; // 计算剩余集装箱重量 + } + // 调用回溯算法 + backtrace(0); + // 输出最优方案 + printf("当前最优方案:\n"); + for (int i = 0; i < n; i++) { + printf("%d: %d\n", boxArr[i], bestx[i]); + } + printf("最优解:%d\n", bestWeight); + return 0; +} diff --git a/c/ch5/loading/huiloading.exe b/c/ch5/loading/huiloading.exe new file mode 100644 index 0000000..2c0c441 Binary files /dev/null and b/c/ch5/loading/huiloading.exe differ diff --git a/c/ch5/loading/loading2.c b/c/ch5/loading/loading2.c new file mode 100644 index 0000000..9a018f0 --- /dev/null +++ b/c/ch5/loading/loading2.c @@ -0,0 +1,59 @@ +#include +#include + +#define MAX_N 100 // 最大集装箱数量 +int n; // 集装箱数 +int boxArr[MAX_N]; // 集装箱重量数组 +int C1; // 第一艘轮船的载重量 +int currWeight = 0; // 当前载重量 +int bestWeight = 0; // 当前最优载重量 +int bestx[MAX_N]; // 最佳装入数组 当前最优解 +int x[MAX_N]; // 装入数组 当前解 + +void backtrace(int i, int leftWeight) {//i集装箱索引,leftWeight剩余重量 + // 1. 到达叶节点 + if (i >= n) { // i此时的值=叶节点+1 + if (currWeight > bestWeight) { + for (int j = 0; j < n; j++) // 记录当前最佳解 + bestx[j] = x[j]; + bestWeight = currWeight; + } + return; + } + // 剪枝1:如果当前背包重量加上剩余的重量都无法超过当前最优解,直接返回 + if (currWeight + leftWeight <= bestWeight) { return; } + // 2. 搜索左子树:选择装入第i个集装箱 + if (currWeight + boxArr[i] <= C1) { // x[i] = 1 + x[i] = 1; + currWeight += boxArr[i]; + backtrace(i + 1, leftWeight - boxArr[i]); // 递归时更新剩余重量 + currWeight -= boxArr[i]; // 回溯时撤销选择 + } + // 3. 搜索右子树:不装入第i个集装箱 + // 剪枝2:如果当前背包容量加上剩余集装箱总重量仍然无法找到更好的解,返回 + if (currWeight + leftWeight > bestWeight) { + x[i] = 0; + backtrace(i + 1, leftWeight - boxArr[i]); // 递归时更新剩余重量 + } +} + +int main() { + // 初始化集装箱信息 + int boxes[] = {4, 5, 6}; + n = sizeof(boxes) / sizeof(boxes[0]); // 货物数量 + C1 = 10; // 第一艘轮船的载重量 + int totalWeight = 0; + for (int i = 0; i < n; i++) {// 设置集装箱重量,并计算总重量 + boxArr[i] = boxes[i]; + totalWeight += boxArr[i]; + } + // 调用回溯算法 + backtrace(0, totalWeight); + // 输出最优方案 + printf("当前最优方案:\n"); + for (int i = 0; i < n; i++) { + printf("%d: %d\n", boxArr[i], bestx[i]); + } + printf("最优解:%d\n", bestWeight); + return 0; +} diff --git a/c/ch5/loading/loading2.exe b/c/ch5/loading/loading2.exe new file mode 100644 index 0000000..6741366 Binary files /dev/null and b/c/ch5/loading/loading2.exe differ diff --git a/c/ch5/queue/nqueue.c b/c/ch5/queue/nqueue.c new file mode 100644 index 0000000..1c74adb --- /dev/null +++ b/c/ch5/queue/nqueue.c @@ -0,0 +1,59 @@ +#include +#include +#include +// 判断当前皇后放置是否合法 +int place(int x[], int j) { + for (int i = 1; i < j; i++) { + // 判断是否在同一列或者是否在同一对角线上 + if (x[i] == x[j] || abs(j - i) == abs(x[j] - x[i])) { + return 0; // 不合法 + } + } + return 1; // 合法 +} +// 非递归方式解 N 皇后问题 +void nQNoRec(int x[], int n) { + int j = 1; // t 表示当前放置第 t 个皇后 + for (int i = 1; i <= n; i++) + x[i] = 0; + while (j >= 1) { + while (x[j] < n) { + x[j] = x[j] + 1; + if (place(x, j)) { + j = j + 1; + if (j > n) { // 到达叶子节点 + for (int i = 1; i <= n; i++) + printf("%d\t", x[i]); + printf("\n"); + j = j - 1; + } + } + } + x[j] = 0; // 回溯时,恢复当前位置的状态 + j = j - 1; // 向上回溯 + } +} + +// 递归方式解 N 皇后问题 +void nQueenRec(int x[], int j, int n) { + if (j > n) {// 搜索到叶子节点 + for (int i = 1; i <= n; i++) + printf("%d\t", x[i]); + printf("\n"); + } else {// 尝试在第 j 行放置皇后 + for (int i = 1; i <= n; i++) { + x[j] = i; + printf("i=%d,j=%d\n",i,j); + if (place(x, j)) + nQueenRec(x, j + 1, n); + } + } +} +int main() { + int n = 6; // 皇后个数 + int x[n + 1]; // 存储每行皇后的位置 + nQueenRec(x, 1, n); // 递归方式解法 + printf("****************************\n"); + nQNoRec(x, n); // 非递归方式解法 + return 0; +} diff --git a/c/ch5/queue/nqueue.exe b/c/ch5/queue/nqueue.exe new file mode 100644 index 0000000..a43d84c Binary files /dev/null and b/c/ch5/queue/nqueue.exe differ diff --git a/c/ch6/graph/bfs.c b/c/ch6/graph/bfs.c new file mode 100644 index 0000000..21a2f1e --- /dev/null +++ b/c/ch6/graph/bfs.c @@ -0,0 +1,86 @@ +#include +#include +#include + +#define MAX_VERTICES 5 // 图的最大顶点数 + +// 图的邻接矩阵表示 +int graph[MAX_VERTICES][MAX_VERTICES] = { + {0, 1, 1, 0, 0}, + {1, 0, 1, 1, 0}, + {1, 1, 0, 0, 1}, + {0, 1, 0, 0, 1}, + {0, 0, 1, 1, 0} +}; + +bool visited[MAX_VERTICES]; // 访问标记数组,用来记录哪些节点已经被访问过 + +// 队列结构 +typedef struct { + int items[MAX_VERTICES]; // 队列的数组表示 + int front; // 队列的前端 + int rear; // 队列的尾端 +} Queue; + +// 队列操作函数 + +// 初始化队列 +void initQueue(Queue *q) { + q->front = 0; + q->rear = -1; // 队列初始化为空 +} + +// 检查队列是否为空 +int isEmpty(Queue *q) { + return q->front > q->rear; +} + +// 入队操作 +void enqueue(Queue *q, int value) { + if (q->rear < MAX_VERTICES - 1) { // 如果队列未满 + q->items[++(q->rear)] = value; // 将新元素添加到队列的尾端 + } +} + +// 出队操作 +int dequeue(Queue *q) { + if (!isEmpty(q)) { + return q->items[(q->front)++]; // 从队列的前端取出一个元素 + } + return -1; // 队列为空时返回 -1 +} + +// 广度优先遍历 BFS 函数 +void bfs(int start, int n) { + Queue q; + initQueue(&q); // 初始化队列 + + enqueue(&q, start); // 将起始节点入队 + visited[start] = true; // 标记起始节点已访问 + + while (!isEmpty(&q)) { // 队列不为空时,继续遍历 + int current = dequeue(&q); // 从队列中取出一个节点 + printf("%d ", current); // 输出当前节点 + + // 遍历当前节点的所有邻接节点 + for (int i = 0; i < n; i++) { + if (graph[current][i] == 1 && !visited[i]) { // 如果当前节点和 i 节点之间有边且 i 节点未被访问 + enqueue(&q, i); // 将 i 节点入队 + visited[i] = true; // 标记 i 节点已访问 + } + } + } +} + +int main() { + int n = MAX_VERTICES; // 图的顶点数 + for (int i = 0; i < n; i++) { + visited[i] = false; // 初始化访问标记数组,将所有节点标记为未访问 + } + + printf("广度优先遍历(BFS):\n"); + bfs(0, n); // 从顶点 0 开始进行 BFS 遍历 + printf("\n"); + + return 0; +} diff --git a/c/ch6/graph/bfs.exe b/c/ch6/graph/bfs.exe new file mode 100644 index 0000000..ebf0f9d Binary files /dev/null and b/c/ch6/graph/bfs.exe differ diff --git a/c/ch6/graph/dfs.c b/c/ch6/graph/dfs.c new file mode 100644 index 0000000..7407fe2 --- /dev/null +++ b/c/ch6/graph/dfs.c @@ -0,0 +1,41 @@ +#include +#include + +#define MAX_VERTICES 5 // 图的最大顶点数 + +// 图的邻接矩阵表示 +int graph[MAX_VERTICES][MAX_VERTICES] = { + {0, 1, 1, 0, 0}, + {1, 0, 1, 1, 0}, + {1, 1, 0, 0, 1}, + {0, 1, 0, 0, 1}, + {0, 0, 1, 1, 0} +}; + +bool visited[MAX_VERTICES]; // 访问标记数组,用来记录哪些节点已经被访问过 + +// 深度优先遍历 DFS 函数 +void dfs(int v, int n) { + printf("%d ", v); // 输出当前节点 + visited[v] = true; // 标记当前节点已访问 + + // 递归访问当前节点的所有未访问的邻接节点 + for (int i = 0; i < n; i++) { + if (graph[v][i] == 1 && !visited[i]) { // 如果存在边且该邻接节点未被访问 + dfs(i, n); // 递归调用,访问该邻接节点 + } + } +} + +int main() { + int n = MAX_VERTICES; // 图的顶点数 + for (int i = 0; i < n; i++) { + visited[i] = false; // 初始化访问标记数组,将所有节点标记为未访问 + } + + printf("深度优先遍历(DFS):\n"); + dfs(0, n); // 从顶点 0 开始进行 DFS 遍历 + printf("\n"); + + return 0; +} diff --git a/c/ch6/graph/dfs.exe b/c/ch6/graph/dfs.exe new file mode 100644 index 0000000..91ffe5b Binary files /dev/null and b/c/ch6/graph/dfs.exe differ diff --git a/c/ch6/tsp/fenzhi/tsp2.c b/c/ch6/tsp/fenzhi/tsp2.c new file mode 100644 index 0000000..41fe327 --- /dev/null +++ b/c/ch6/tsp/fenzhi/tsp2.c @@ -0,0 +1,78 @@ +#include +#include +#define MAX_CITIES 4 // 设定城市数量为4 +#define INF INT_MAX +int n = MAX_CITIES; // 城市数量 +int dist[MAX_CITIES][MAX_CITIES] = { // 距离矩阵 + {0, 30, 6, 4}, // 城市 0 到其他城市的距离 + {30, 0, 5, 10}, // 城市 1 到其他城市的距离 + {6, 5, 0, 20}, // 城市 2 到其他城市的距离 + {4, 10, 20, 0} // 城市 3 到其他城市的距离 +}; +int bestPath[MAX_CITIES]; // 最优路径 +int bestCost = INF; // 最优路径的总成本 +// 计算从节点current到下一个节点的界限 +int calculateLowerBound(int path[], int current) { + int lowerBound = 0; + int visited[MAX_CITIES] = {0}; + // 计算已访问的路径的距离 + for (int i = 0; i < current; i++) { + lowerBound += dist[path[i]][path[i + 1]]; + visited[path[i]] = 1; + } + // 计算当前节点到其他未访问节点的最短距离 + for (int i = 0; i < n; i++) { + if (!visited[i]) { + int minDist = INF; + for (int j = 0; j < n; j++) { + if (!visited[j] && dist[i][j] < minDist) { + minDist = dist[i][j]; + } + } + lowerBound += minDist; + } + } + return lowerBound; +} +// 分支限界法求解TSP +void branchAndBound(int path[], int current, int cost) { + if (current == n) { + // 所有城市都已访问,检查是否是最优解 + cost += dist[path[current - 1]][path[0]]; // 加上返回起点的距离 + if (cost < bestCost) { + bestCost = cost; + for (int i = 0; i < n; i++) { + bestPath[i] = path[i]; + } + } + return; + } + // 计算当前路径的界限 + int lowerBound = cost + calculateLowerBound(path, current); + // 如果当前解已经不可能优于最优解,剪枝 + if (lowerBound >= bestCost) return; + // 继续扩展路径 + for (int i = 0; i < n; i++) { + int flag = 0; + for (int j = 0; j < current; j++) { + if (path[j] == i) { + flag = 1; // 检查当前城市是否已访问 + break; + } + } + if (flag == 0) { + path[current] = i; + branchAndBound(path, current + 1, cost + dist[path[current - 1]][i]); + } + } +} +int main() { + int path[MAX_CITIES]; + path[0] = 0; // 从第一个城市出发 + branchAndBound(path, 1, 0); + printf("\n最优路径是: "); + for (int i = 0; i < n; i++) + printf("%d ", bestPath[i]); + printf("\n总路程: %d\n", bestCost); + return 0; +} diff --git a/c/ch6/tsp/fenzhi/tsp2.exe b/c/ch6/tsp/fenzhi/tsp2.exe new file mode 100644 index 0000000..19b2f4c Binary files /dev/null and b/c/ch6/tsp/fenzhi/tsp2.exe differ diff --git a/c/ch6/tsp/huisu/travelroute.c b/c/ch6/tsp/huisu/travelroute.c new file mode 100644 index 0000000..77eb43a --- /dev/null +++ b/c/ch6/tsp/huisu/travelroute.c @@ -0,0 +1,43 @@ +#include +#include +#define MAX_CITIES 4 // 城市数量 +#define INF INT_MAX +int n = MAX_CITIES; // 城市数量 +int dist[MAX_CITIES][MAX_CITIES] = { + {0, 30, 6, 4}, {30, 0, 5, 10}, + {6, 5, 0, 20}, {4, 10, 20, 0} +}; +int visited[MAX_CITIES]; // 标记城市是否访问 +int bestPath[MAX_CITIES]; // 最优路径 +int bestCost = INF; // 最优路径的总成本 +// 回溯法求解TSP +void backtrack(int currentCity, int count, int cost, int path[]) { + if (count == n) { // 所有城市都已访问,检查是否是最优解 + cost += dist[currentCity][0]; // 加上返回起点的距离 + if (cost < bestCost) { + bestCost = cost; + for (int i = 0; i < n; i++) + bestPath[i] = path[i]; + } + return; + } + for (int i = 0; i < n; i++) {// 尝试所有未访问的城市 + if (!visited[i]) { // 访问城市i + visited[i] = 1; path[count] = i; + // 递归访问下一个城市 + backtrack(i, count + 1, cost + dist[currentCity][i], path); + visited[i] = 0; // 回溯 + } + } +} +int main() { + int path[MAX_CITIES]; + visited[0] = 1; // 从第一个城市出发 + path[0] = 0; // 起点是城市0 + backtrack(0, 1, 0, path); // 从城市0开始回溯 + printf("\n最优路径是: "); + for (int i = 0; i < n; i++) + printf("%d ", bestPath[i]); + printf("\n最小路程: %d\n", bestCost); + return 0; +} diff --git a/c/ch6/tsp/huisu/travelroute.exe b/c/ch6/tsp/huisu/travelroute.exe new file mode 100644 index 0000000..6b0daa9 Binary files /dev/null and b/c/ch6/tsp/huisu/travelroute.exe differ diff --git a/c/ch6/xianbag01/bag01fifo.c b/c/ch6/xianbag01/bag01fifo.c new file mode 100644 index 0000000..ad952df --- /dev/null +++ b/c/ch6/xianbag01/bag01fifo.c @@ -0,0 +1,90 @@ +#include +#include +#define CAPACITY 30 +#define N 3 +#define QUEUE_SIZE 100 // 定义队列的最大容量(静态分配) +typedef struct {// 定义节点结构体 + int level; // 当前节点所在的层数(即考虑第几个物品) + int weight; // 当前已装入物品的总重量 + int value; // 当前已获得的总价值 + bool items[N]; // 布尔数组,记录每个物品是否被选择 +} Node; +// 定义队列结构体,使用数组模拟队列 +typedef struct { + Node liveList[QUEUE_SIZE]; // 队列的存储数组 + int front, rear; // 队列的头部和尾部指针 +} Queue; +// 初始化队列,设置front为0,rear为-1表示空队列 +void initQueue(Queue* queue) { + queue->front = 0; queue->rear = -1; +} +// 检查队列是否为空,如果front大于rear则为空 +int isEmpty(Queue* queue) { + return queue->front > queue->rear; +} +// 向队列中添加元素,使用前置自增保证新元素放置在正确位置 +void insertQueue(Queue* queue, Node item) { + queue->liveList[++(queue->rear)] = item; +} +// 从队列中移除并返回元素,如果队列为空则返回一个空节点 +Node popQueue(Queue* queue) { + if (isEmpty(queue)) { + static Node emptyNode = {-1, -1, -1, {false}}; + return emptyNode; + } + return queue->liveList[(queue->front)++]; +} +// 使用广度优先搜索(BFS)解决01背包问题 +void bag01bfs(Queue* queue, int weightArr[], int value[], int n, int maxWeight, + int* maxValue, bool bestItems[]) { + // 创建初始节点(level=0,weight=0,value=0,items全为false),并将其加入队列 + Node node = {0, 0, 0, {false}}; + insertQueue(queue, node); + while (!isEmpty(queue)) { // 开始广度优先搜索 + Node u = popQueue(queue); // 取出队列中的第一个节点 + // 如果遇到空节点,跳过本次循环 + if (u.level == -1) continue; + if (u.level == n) { // 如果到达最后一层(所有物品都考虑完毕) + if (u.value > *maxValue) { // 更新最大价值和最优解 + *maxValue = u.value; + for (int i = 0; i < N; ++i) + bestItems[i] = u.items[i]; + } + continue; + } + // 分支:包含当前物品的情况 + if (u.weight + weightArr[u.level] <= maxWeight) { + // 创建新节点v,代表选择了当前物品的情况 + Node v = {u.level + 1, u.weight + weightArr[u.level], u.value + value[u.level]}; + for (int i = 0; i < N; ++i) + v.items[i] = u.items[i]; + v.items[u.level] = true; + insertQueue(queue, v); + } + // 分支:不包含当前物品的情况 + Node w = {u.level + 1, u.weight, u.value}; + for (int i = 0; i < N; ++i) + w.items[i] = u.items[i]; + insertQueue(queue, w); + } +} + +int main() { + // 定义每个物品的重量和价值 + int weightArr[N] = {16, 15, 15}; // 每个物品的重量 + int value[N] = {45, 25, 25}; // 每个物品的价值 + int maxValue = 0; // 最大价值 + bool bestItems[N] = {false}; // 记录最优解的物品选择情况 + Queue queue; + initQueue(&queue); // 初始化队列 + // 调用bag01bfs函数解决背包问题 + bag01bfs(&queue, weightArr, value, N, CAPACITY, &maxValue, bestItems); + // 输出结果 + printf("最大价值是 %d\n", maxValue); + printf("选择的物品:"); + for (int i = 0; i < N; ++i) { + if (bestItems[i]) + printf("%d ", i + 1); // 输出物品编号(从1开始) + } + return 0; +} \ No newline at end of file diff --git a/c/ch6/xianbag01/bag01fifo.exe b/c/ch6/xianbag01/bag01fifo.exe new file mode 100644 index 0000000..e38eb9f Binary files /dev/null and b/c/ch6/xianbag01/bag01fifo.exe differ diff --git a/c/ch6/xianbag01/bag01livevalue.c b/c/ch6/xianbag01/bag01livevalue.c new file mode 100644 index 0000000..ad06c48 --- /dev/null +++ b/c/ch6/xianbag01/bag01livevalue.c @@ -0,0 +1,176 @@ +#include +#include + +#define N 3 // 物品数量 +#define CAPACITY 30 // 背包容量 +#define MAX_NODES (N * 2) // 估计的最大节点数 + +// 物品结构体 +typedef struct { + int weight; + int value; +} Item; + +// 活结点结构体 +typedef struct { + int level; // 当前节点的层级 + int profit; // 当前节点的价值 + int weight; // 当前节点的重量 + float bound; // 当前节点的上界 +} Node; + +// 优先队列(最大堆) +typedef struct { + Node nodes[MAX_NODES]; + int size; +} PriorityQueue; + +// 初始化优先队列 +void initQueue(PriorityQueue* pq) { + pq->size = 0; +} + +// 插入节点到优先队列 +void insert(PriorityQueue* pq, Node node) { + if (pq->size == MAX_NODES) { + printf("Priority queue is full.\n"); + return; + } + int i = pq->size++; + while (i > 0 && pq->nodes[(i - 1) / 2].bound < node.bound) { + pq->nodes[i] = pq->nodes[(i - 1) / 2]; + i = (i - 1) / 2; + } + pq->nodes[i] = node; +} + +// 删除并返回优先队列的最大元素 +Node removeMax(PriorityQueue* pq) { + if (pq->size <= 0) { + printf("Priority queue is empty.\n"); + exit(1); + } + Node max = pq->nodes[0]; + pq->nodes[0] = pq->nodes[--pq->size]; + int i = 0; + while (2 * i + 1 < pq->size) { + int left = 2 * i + 1; + int right = 2 * i + 2; + int largest = i; + if (left < pq->size && pq->nodes[left].bound > pq->nodes[largest].bound) + largest = left; + if (right < pq->size && pq->nodes[right].bound > pq->nodes[largest].bound) + largest = right; + if (largest != i) { + Node temp = pq->nodes[i]; + pq->nodes[i] = pq->nodes[largest]; + pq->nodes[largest] = temp; + i = largest; + } else break; + } + return max; +} + +// 计算节点的上界(bound),这是通过贪心策略估计的最大可能价值 +float calculateBound(Node u, int n, int W, Item items[]) { + if (u.weight >= W) return 0; + + int j = u.level + 1; + float bound = u.profit; + int totalWeight = u.weight; + + // 从当前节点继续往下选择物品的贪心解(按单位价值排序) + while (j < n && totalWeight + items[j].weight <= W) { + totalWeight += items[j].weight; + bound += items[j].value; + j++; + } + + if (j < n) { + bound += (W - totalWeight) * ((float)items[j].value / items[j].weight); + } + + return bound; +} + +// 比较函数,用于qsort排序 +int compareItems(const void* a, const void* b) { + Item* itemA = (Item*)a; + Item* itemB = (Item*)b; + float unitValueA = (float)itemA->value / itemA->weight; + float unitValueB = (float)itemB->value / itemB->weight; + return (unitValueB - unitValueA) > 0 ? 1 : -1; +} + +// 0-1 背包问题的分支限界法 +int knapsackBranchAndBound(Item items[], int n, int W) { + // 按照单位价值对物品进行排序 + qsort(items, n, sizeof(Item), compareItems); + + PriorityQueue pq; + initQueue(&pq); + + // 初始化第一个节点 + Node u = { -1, 0, 0, 0.0 }; + insert(&pq, u); + + int maxProfit = 0; + + while (pq.size > 0) { + // 取出优先队列中的最大元素 + u = removeMax(&pq); + + // 如果当前节点的 bound 值不大于最大收益,则剪枝 + if (u.bound <= maxProfit) continue; + + // 尝试将下一个物品放入背包 + Node v = u; + v.level++; + + if (v.level < n) { + // 选择第 v.level 个物品 + if (v.weight + items[v.level].weight <= W) { + v.weight += items[v.level].weight; + v.profit += items[v.level].value; + if (v.profit > maxProfit) { + maxProfit = v.profit; + } + v.bound = calculateBound(v, n, W, items); + if (v.bound > maxProfit) { + insert(&pq, v); + } + } + + // 不选择第 v.level 个物品 + v = u; + v.level++; + v.bound = calculateBound(v, n, W, items); + if (v.bound > maxProfit) { + insert(&pq, v); + } + } + } + + return maxProfit; +} + +int main() { + // 已经填写的数据 + int weightArr[N] = {16, 15, 15}; // 每个物品的重量 + int valueArr[N] = {45, 25, 25}; // 每个物品的价值 + + // 初始化物品数组 + Item items[N]; + for (int i = 0; i < N; i++) { + items[i].weight = weightArr[i]; + items[i].value = valueArr[i]; + } + + // 调用分支限界法求解0-1背包问题 + int maxProfit = knapsackBranchAndBound(items, N, CAPACITY); + + // 输出最大收益 + printf("Maximum profit: %d\n", maxProfit); + + return 0; +} \ No newline at end of file diff --git a/c/ch6/xianbag01/bag01livevalue.exe b/c/ch6/xianbag01/bag01livevalue.exe new file mode 100644 index 0000000..4ea3b02 Binary files /dev/null and b/c/ch6/xianbag01/bag01livevalue.exe differ diff --git a/c/final/PaperB/guibing.c b/c/final/PaperB/guibing.c new file mode 100644 index 0000000..f49c75a --- /dev/null +++ b/c/final/PaperB/guibing.c @@ -0,0 +1,48 @@ +#include +// 归并函数 +void merge(int arr[], int left, int middle, + int right, int temp[]) { + int i = left; // 左数组起始索引 + int j = middle + 1; // 右数组起始索引 + int k = left; // 合并后数组起始索引 + // 将数据复制到临时数组 + for (int m = left; m <= right; ++m) + temp[m] = arr[m]; + // 合并临时数组到 arr[left..right] + while (i <= middle && j <= right) { + if (temp[i] <= temp[j]) + arr[k++] = temp[i++]; + else + arr[k++] = temp[j++]; + } + // 拷贝剩余元素(如果有) + while (i <= middle) + arr[k++] = temp[i++]; +} +// 归并排序函数 +void mergeSort(int arr[], int left, int right, int temp[]) { + if (left < right) { + int middle = left + (right - left) / 2; + mergeSort(arr, left, middle, temp); // 排左半部分 + mergeSort(arr, middle + 1, right, temp); // 排右半部分 + merge(arr, left, middle, right, temp); // 合并两个已排部分 + } +} +// 打印数组 +void printArray(int arr[], int size) { + for (int i = 0; i < size; i++) + printf("%d ", arr[i]); + printf("\n"); +} + +int main() { + int arr[] = {8, 7, 6, 15, 4, 3, 2, 10}; + int arrSize = sizeof(arr) / sizeof(arr[0]); + int temp[arrSize]; + printf("原始数组: "); + printArray(arr, arrSize); + mergeSort(arr, 0, arrSize - 1, temp); + printf("排序后的数组: "); + printArray(arr, arrSize); + return 0; +} \ No newline at end of file diff --git a/c/final/PaperB/guibing.exe b/c/final/PaperB/guibing.exe new file mode 100644 index 0000000..1b427c3 Binary files /dev/null and b/c/final/PaperB/guibing.exe differ diff --git a/c/final/nqueenPlus/safequeue.c b/c/final/nqueenPlus/safequeue.c new file mode 100644 index 0000000..8db11e8 --- /dev/null +++ b/c/final/nqueenPlus/safequeue.c @@ -0,0 +1,69 @@ +#include +#include +#include + + +// 判断当前皇后放置是否合法 +int place(int x[], int j, int n) { + if (x[j] == j ) + return 0; // 禁用:位置在棋盘左上到右下对角线上 + // 判断是否在同一列,或者是否在同一对角线上 + for (int i = 1; i < j; i++) { + if (x[i] == x[j] || abs(j - i) == abs(x[j] - x[i])) + return 0; // 不合法 + } + return 1; // 合法 +} + +// 非递归方式解 N 皇后问题 +void nQNoRec(int x[], int n) { + int j = 1; // j 表示当前放置第 j 个皇后 + for (int i = 1; i <= n; i++) + x[i] = 0; + + while (j >= 1) { + while (x[j] < n) { + x[j] = x[j] + 1; + if (place(x, j, n)) { + j = j + 1; + if (j > n) { // 到达叶子节点 + // 输出解 + for (int i = 1; i <= n; i++) + printf("%d\t", x[i]); + printf("\n"); + j = j - 1; + } + } + } + x[j] = 0; // 回溯时,恢复当前位置的状态 + j = j - 1; // 向上回溯 + } +} +// 递归方式解 N 皇后问题 +void nQueenRec(int x[], int j, int n) { + if (j > n) { // 搜索到叶子节点 + // 输出解 + for (int i = 1; i <= n; i++) + printf("%d\t", x[i]); + printf("\n"); + } else { // 尝试在第 j 行放置皇后 + for (int i = 1; i <= n; i++) { + x[j] = i; + if (place(x, j, n)) + nQueenRec(x, j + 1, n); + } + } +} + +int main() { + int n = 6; // 皇后个数 + int x[n + 1]; // 存储每行皇后的位置 + + printf("Recursive solution:\n"); + nQueenRec(x, 1, n); // 递归方式解法 + printf("****************************\n"); + printf("Non-recursive solution:\n"); + nQNoRec(x, n); // 非递归方式解法 + + return 0; +} diff --git a/c/final/nqueenPlus/safequeue.exe b/c/final/nqueenPlus/safequeue.exe new file mode 100644 index 0000000..6ce0c00 Binary files /dev/null and b/c/final/nqueenPlus/safequeue.exe differ diff --git a/c/final/nqueenPlus/testnqplus.c b/c/final/nqueenPlus/testnqplus.c new file mode 100644 index 0000000..e480831 --- /dev/null +++ b/c/final/nqueenPlus/testnqplus.c @@ -0,0 +1,82 @@ +#include +#include +#include + +#define MIN_DISTANCE 2 + +// 判断当前皇后放置是否合法,并且符合安全距离条件 +int place(int x[], int j) { + for (int i = 1; i < j; i++) { + // 检查列冲突、对角线冲突以及最小安全距离 + if (x[i] == x[j] || abs(j - i) == abs(x[j] - x[i]) || + abs(x[j] - x[i]) < MIN_DISTANCE || abs(j - i) < MIN_DISTANCE) { + return 0; // 不合法 + } + } + return 1; // 合法 +} + +// 非递归方式解 N 皇后问题 +void nQNoRec(int x[], int n, int *foundSolution) { + int j = 1; // j 表示当前放置第 j 个皇后 + for (int i = 1; i <= n; i++) + x[i] = 0; + while (j >= 1) { + while (x[j] < n) { + x[j] = x[j] + 1; + if (place(x, j)) { + j = j + 1; + if (j > n) { // 到达叶子节点 + *foundSolution = 1; + return; // 找到一个解即可返回 + } + } + } + x[j] = 0; // 回溯时,恢复当前位置的状态 + j = j - 1; // 向上回溯 + } +} + +// 递归方式解 N 皇后问题 +void nQueenRec(int x[], int j, int n, int *foundSolution) { + if (j > n) { // 搜索到叶子节点 + *foundSolution = 1; + return; // 找到一个解即可返回 + } else { // 尝试在第 j 行放置皇后 + for (int i = 1; i <= n; i++) { + x[j] = i; + if (place(x, j)) + nQueenRec(x, j + 1, n, foundSolution); + if (*foundSolution) return; // 如果已经找到解,则提前退出 + } + } +} + +int main() { + + for (int n = 1; n <= 100; n++) { + int x[n + 1]; // 存储每行皇后的位置 + int hasSolution = 0; + + printf("Testing n = %d:\n", n); + + // 使用非递归方式检查是否有解 + nQNoRec(x, n, &hasSolution); + if (hasSolution) { + printf("There is at least one solution for n = %d.\n", n); + } else { + printf("No solution found for n = %d.\n", n); + } + + // 也可以使用递归方式进行验证(可选) + // hasSolution = 0; + // nQueenRec(x, 1, n, &hasSolution); + // if (!hasSolution) { + // printf("No solution found for n = %d using recursive method.\n", n); + // } + + printf("****************************\n"); + } + + return 0; +} \ No newline at end of file diff --git a/c/final/nqueenPlus/testnqplus.exe b/c/final/nqueenPlus/testnqplus.exe new file mode 100644 index 0000000..7cc7a2f Binary files /dev/null and b/c/final/nqueenPlus/testnqplus.exe differ diff --git a/c/final/visit4char.c b/c/final/visit4char.c new file mode 100644 index 0000000..7f3d6ba --- /dev/null +++ b/c/final/visit4char.c @@ -0,0 +1,60 @@ +#include +#include + +#define NUM_PLACES 4 + +void printPath(int *path) { + for (int i = 0; i < NUM_PLACES; ++i) + printf("%c", 'A' + path[i]); // 将数字转换为对应的字母(例如:0 -> 'A', 1 -> 'B' 等) + printf("\n"); +} + +// 回溯函数:尝试构建所有可能的路径组合 +void backtrack(int *path, bool used[NUM_PLACES], int step) { + // 如果已经到达了最后一个步骤,则打印路径 + if (step == NUM_PLACES) { + printPath(path); // 调用打印函数 + return; + } + // 尝试每一个可能的下一个位置 + for (int next = 0; next < NUM_PLACES; ++next) { + // 如果这个位置还没有被使用过 + if (!used[next]) { + // 特殊情况处理:如果当前要放置的是 A (即 next == 0) + // 并且后面还有空间放置 B (即 step + 1 < NUM_PLACES) + // 同时 B 还没有被使用过 (!used[1]) + if (next == 0 && step + 1 < NUM_PLACES && !used[1]) { + // 把 A 和 B 作为一对连续的位置放置 + path[step] = 0; // 放置 A + path[step + 1] = 1; // 放置 B + used[0] = used[1] = true; // 标记 A 和 B 已经被使用 + + // 继续递归寻找后续的路径 + backtrack(path, used, step + 2); + + // 回溯:取消标记 A 和 B 的使用状态 + used[0] = used[1] = false; + } else if (next != 0 && next != 1) { // 如果不是 A 或 B + // 只放置 C 或者 D,确保 A 总是紧跟着 B 出现 + path[step] = next; // 放置 C 或 D + used[next] = true; // 标记当前位置已被使用 + + // 继续递归寻找后续的路径 + backtrack(path, used, step + 1); + + // 回溯:取消标记当前位置的使用状态 + used[next] = false; + } + } + } +} + +int main() { + int path[NUM_PLACES]; // 创建一个用来存储路径的数组 + bool used[NUM_PLACES] = {false}; // 创建一个布尔数组来追踪哪些位置已经被使用 + + // 开始回溯,从一个空路径开始 + backtrack(path, used, 0); + + return 0; +} \ No newline at end of file diff --git a/c/final/visit4char.exe b/c/final/visit4char.exe new file mode 100644 index 0000000..965538a Binary files /dev/null and b/c/final/visit4char.exe differ diff --git a/c/final/visit4chardigui.c b/c/final/visit4chardigui.c new file mode 100644 index 0000000..3b79441 --- /dev/null +++ b/c/final/visit4chardigui.c @@ -0,0 +1,39 @@ +#include +#include +#define NUM_PLACES 4 +// 回溯函数:尝试构建所有可能的路径组合,A 总是紧跟 B +void backtrack(int *path, bool used[NUM_PLACES], int step) +{ + if (step >= NUM_PLACES) + { // 边界条件:当步骤数等于地点数时打印路径 + for (int i = 0; i < NUM_PLACES; ++i) + printf("%c", 'A' + path[i]); + printf("\n"); + return; + } + // 如果还有足够的空间,尝试放置 A 和 B 作为一对 + if (step + 1 < NUM_PLACES && !used[0] && !used[1]) { + path[step] = 0; // 放置 A + path[step + 1] = 1; // 放置 B + used[0] = used[1] = true; + backtrack(path, used, step + 2); + used[0] = used[1] = false; + } + // 尝试放置 C 或 D + for (int i = 2; i < NUM_PLACES; ++i) { + if (!used[i]) { + path[step] = i; + used[i] = true; + backtrack(path, used, step + 1); + used[i] = false; + } + } +} + +int main(){ + int path[NUM_PLACES]; + bool used[NUM_PLACES] = {false}; + // 开始回溯,从一个空路径开始 + backtrack(path, used, 0); + return 0; +} \ No newline at end of file diff --git a/c/final/visit4chardigui.exe b/c/final/visit4chardigui.exe new file mode 100644 index 0000000..5d213da Binary files /dev/null and b/c/final/visit4chardigui.exe differ diff --git a/c/final/visit4num.c b/c/final/visit4num.c new file mode 100644 index 0000000..7a3df5b --- /dev/null +++ b/c/final/visit4num.c @@ -0,0 +1,47 @@ +#include +#include + +#define NUM_PLACES 4 + +// 函数:打印路径,将索引转换为1到4的数字表示 +void printPath(int *path) { + for (int i = 0; i < NUM_PLACES; ++i) { + printf("%d ", path[i] + 1); // 将索引转换为1-based索引(即0变为1, 1变为2等) + } + printf("\n"); // 打印完路径后换行 +} + +// 回溯函数:生成所有符合条件的路径 +void backtrack(int *path, bool used[NUM_PLACES], int step) { + if (step == NUM_PLACES) { // 如果已经选择了所有的地点 + printPath(path); // 打印当前路径 + return; + } + for (int next = 0; next < NUM_PLACES; ++next) { // 尝试选择下一个地点 + if (!used[next]) { // 如果该地点还没有被访问过 + if (next == 0 && step + 1 < NUM_PLACES && !used[1]) { + // 如果当前要放置的是地点1,并且后面还有空间且地点2未被使用, + // 则将地点1和地点2作为一个单元放置在一起 + path[step] = 0; // 放置地点1 + path[step + 1] = 1; // 紧接着放置地点2 + used[0] = used[1] = true; // 标记地点1和地点2为已使用 + backtrack(path, used, step + 2); // 递归尝试下一步 + used[0] = used[1] = false; // 回溯,恢复状态 + } else if (next != 0 && next != 1) { + // 如果当前不是选择地点1或地点2,则可以选择地点3或地点4 + path[step] = next; // 放置地点3或地点4 + used[next] = true; // 标记该地点为已使用 + backtrack(path, used, step + 1); // 递归尝试下一步 + used[next] = false; // 回溯,恢复状态 + } + } + } +} + +int main() { + int path[NUM_PLACES]; // 用于存储路径的数组 + bool used[NUM_PLACES] = {false}; // 用于跟踪哪些地点已经被访问过 + // 从一个空路径开始回溯 + backtrack(path, used, 0); + return 0; +} \ No newline at end of file diff --git a/c/final/visit4num.exe b/c/final/visit4num.exe new file mode 100644 index 0000000..6ed6e0a Binary files /dev/null and b/c/final/visit4num.exe differ diff --git a/c/test/ab.c b/c/test/ab.c new file mode 100644 index 0000000..917cf22 --- /dev/null +++ b/c/test/ab.c @@ -0,0 +1,37 @@ +#include + + + +int main() + +{ + +int a[5][2]={{50,0},{20,0},{10,0},{5,0},{1,0}}; + +int amount=0; + +printf("请输入找零:"); + +scanf("%d",&amount); + +for(int i=0;i<5;i++) + +{ + +a[i][1]=amount/a[i][0]; + +amount=amount%a[i][0]; + +} + +for(int j=0;j<5;j++) + +{ + +printf("面额%d元的张数:%d\n",a[j][0],a[j][1]); + +} + +return 0; + +} \ No newline at end of file diff --git a/c/test/ab.exe b/c/test/ab.exe new file mode 100644 index 0000000..af1c640 Binary files /dev/null and b/c/test/ab.exe differ diff --git a/c/test/ctrip.json b/c/test/ctrip.json new file mode 100644 index 0000000..8b50fa0 --- /dev/null +++ b/c/test/ctrip.json @@ -0,0 +1,716 @@ +{ + "AdditionalBaggageInfoList": [ + { + "BaggageDesc": "托运行李标准:单件重量不能超过50千克,且单件体积不能超过40×60×100厘米。单件体积超过40×60×100厘米的行李需按照特殊行李执行或须事先征得同意方能托运。 \n每位旅客可免费携带1件随身软包,单件重量不能超过10千克且体积不能超过20×40×55厘米。软包包括双肩背包、斜挎包、手拎包等(不含带有拉杆或轮子的行李箱)。", + "BaggageDimension": { + "DimensionAllowance": "40*60*100", + "DimensionAllowanceTypeCode": 0 + }, + "PieceAllowance": 1, + "SubTypeCode": 1, + "TotalWeightAllowance": null, + "TypeCode": 0, + "WeightAllowance": 23 + }, + { + "BaggageDesc": "托运行李标准:单件重量不能超过50千克,且单件体积不能超过40×60×100厘米。单件体积超过40×60×100厘米的行李需按照特殊行李执行或须事先征得同意方能托运。 \n每位旅客可免费携带1件随身软包,单件重量不能超过10千克且体积不能超过20×40×55厘米。软包包括双肩背包、斜挎包、手拎包等(不含带有拉杆或轮子的行李箱)。", + "BaggageDimension": { + "DimensionAllowance": "0", + "DimensionAllowanceTypeCode": 0 + }, + "PieceAllowance": 0, + "SubTypeCode": 0, + "TotalWeightAllowance": null, + "TypeCode": 1, + "WeightAllowance": 0 + } + ], + "AirlineRecordNo": "NVXQDX", + "CustomerID": "", + "EmailRequiredFlag": 0, + "ExternalOrderID": "", + "ExtraInfo": { + "OverSeaChannel": "F" + }, + "ExtraPropertyList": [], + "IssuingChannelType": 0, + "IssuingClaimingOperator": "深圳华中", + "IssuingInfo": { + "AutomaticIssuingAccount": null, + "CancelIssuingStatus": 0, + "CreateIssuingDateTime": "2024-11-28 16:11:54", + "IssuingAttributeList": [ + "HaveBaggage" + ], + "IssuingDateTimeLimit": "2024-11-28 17:11:53", + "IssuingMethod": 2, + "IssuingRemark": "[{\"airportRemark\":\"SHE-WNZ\",\"baggageInfo\":\"行李额:SHE-WNZ:成人:免费托运行李额1件,每件23公斤;\",\"contactRemark\":null,\"domesticProcessRemark\":\"不允许降舱降价,对比外采标品出票,如变价尝试BSP出票\",\"flightDesc\":null,\"ptCmd\":null,\"qteCommandCode\":null,\"relatedOrderRemark\":null}]", + "IssuingStatus": 1, + "TicketTimeLimit": "2024-11-28 16:25:00", + "TicketType": 2, + "UrgeTimes": 0, + "ValidatingCarrierCode": "" + }, + "IssuingRelatedInfoList": [], + "JourneyInfoList": [ + { + "ActualPaymentInfo": null, + "AncillaryInfoList": [], + "BaggageAllowance": null, + "BaggageAndMealInfo": null, + "BaggageInfoList": [ + { + "BaggageDesc": "托运行李标准:单件重量不能超过50千克,且单件体积不能超过40×60×100厘米。单件体积超过40×60×100厘米的行李需按照特殊行李执行或须事先征得同意方能托运。 \n每位旅客可免费携带1件随身软包,单件重量不能超过10千克且体积不能超过20×40×55厘米。软包包括双肩背包、斜挎包、手拎包等(不含带有拉杆或轮子的行李箱)。", + "BaggageDimension": { + "DimensionAllowance": "40*60*100", + "DimensionAllowanceTypeCode": 0 + }, + "PieceAllowance": 1, + "SubTypeCode": 1, + "TotalWeightAllowance": null, + "TypeCode": 0, + "WeightAllowance": 23 + }, + { + "BaggageDesc": "托运行李标准:单件重量不能超过50千克,且单件体积不能超过40×60×100厘米。单件体积超过40×60×100厘米的行李需按照特殊行李执行或须事先征得同意方能托运。 \n每位旅客可免费携带1件随身软包,单件重量不能超过10千克且体积不能超过20×40×55厘米。软包包括双肩背包、斜挎包、手拎包等(不含带有拉杆或轮子的行李箱)。", + "BaggageDimension": { + "DimensionAllowance": "0", + "DimensionAllowanceTypeCode": 0 + }, + "PieceAllowance": 0, + "SubTypeCode": 0, + "TotalWeightAllowance": null, + "TypeCode": 1, + "WeightAllowance": 0 + } + ], + "BrandInfo": null, + "DiscountCode": null, + "DiscountInfoList": [], + "FlightRightList": [], + "FrequentFlyerInfo": { + "FrequentFlyerAirline": "", + "FrequentFlyerCardNo": "" + }, + "HabitationCode": null, + "IssuingFeeInfo": { + "AccountPrice": 526.800000, + "CurrencyCode": "CNY", + "FuelSurcharge": 20.000000, + "ObFee": null, + "PrintPrice": 530.000000, + "Tax": 50.000000 + }, + "IssuingFlightInfo": { + "AgencyAirlineRecordNo": "NVXQDX", + "AgencyOfficeNo": "SZX340", + "AgencyRecordNo": "KMTEWB", + "AirlineCode": null, + "ArrivalAirportCode": "WNZ", + "ArrivalCityCode": "WNZ", + "ArrivalDateTime": "2024-11-29 13:55:00", + "BookingEmail": null, + "CabinClass": "Y", + "DepartureAirportCode": "SHE", + "DepartureCityCode": "SHE", + "DepartureDateTime": "2024-11-29 10:40:00", + "JourneyNo": 1, + "MarketingFlightNo": "KN5276", + "OfficeNo": "SZX340", + "OperatingFlightNo": "", + "PNR": "KMTEWB", + "RBD": "I", + "RealRBD": null, + "SegmentNo": 1, + "TicketNo": null + }, + "PTC": "ADU", + "PassengerInfo": { + "AgeType": "ADU", + "Birthdate": "1977-12-01", + "GenderCode": "M", + "IdentityDocList": [ + { + "BookingUser": "", + "CardNo": "nqDf8oV2Dsi+FbknzQu413MR92t4z+sgwLs6UlUKJNc=", + "CardType": 1, + "ExpiryDate": null, + "IdentityDocID": 0, + "IssuingCountryCode": "", + "ModifiedPassengerName": "", + "PaxLocalLanguage": "", + "PaxName": "钱丐有" + } + ], + "MobilePhone": { + "CountryCode": null, + "PhoneNo": null + }, + "Nationality": "CN", + "PassengerID": 1, + "PaxID": 0 + }, + "PassengerNameType": null, + "PaymentType": null, + "SeatSelectionInfo": null, + "SpecialIdentityDocList": [], + "VCNInfo": null + } + ], + "OfficeNo": "SZX340", + "PNR": "KMTEWB", + "PenaltyInfoList": [ + { + "PenaltyInfo": { + "FormattedInfoList": [ + { + "Currency": "CNY", + "ExtensionInfoList": [ + { + "ApplicableScenario": "Normal", + "FeeCalculationBaseline": 0, + "PTC": "ADU", + "RefundRebookTypeList": [] + } + ], + "RebookingList": [ + { + "ApplicableScene": "Normal", + "FirstTimeFree": false, + "Flag": null, + "Note": { + "NoteCHN": "航班规定离站时间30天(含)之前免收变更手续费,航班规定离站时间前30天至7天(含)之内收取票面价10%的变更手续费,航班规定离站时间前7天至72小时(含)之内收取票面价30%的变更手续费,航班规定离站时间前72小时至4小时(含)之内收取票面价50%的变更手续费,航班规定离站时间前4小时之后收取票面价60%的变更手续费" + }, + "PTC": "ADU", + "RebookingFeeList": [ + { + "AgencyServiceFee": 0, + "Amount": 0, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-10-30T10:40:00+08", + "EndMinute": 43200, + "FeeRate": 0, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "0001-01-01T00:00:00+08", + "StartMinute": -1, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 53, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-11-22T10:40:00+08", + "EndMinute": 10080, + "FeeRate": 0.1, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-10-30T10:40:00+08", + "StartMinute": 43200, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 159, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-11-26T10:40:00+08", + "EndMinute": 4320, + "FeeRate": 0.3, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-11-22T10:40:00+08", + "StartMinute": 10080, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 265, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-11-29T06:40:00+08", + "EndMinute": 240, + "FeeRate": 0.5, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-11-26T10:40:00+08", + "StartMinute": 4320, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 318, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "9999-12-31T08:00:00+08", + "EndMinute": -1, + "FeeRate": 0.6, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-11-29T06:40:00+08", + "StartMinute": 240, + "TaxRefund": 0, + "TimesAndFeeList": [] + } + ], + "ServiceFeeNote": null + } + ], + "RefundList": [ + { + "AllRefundDeductedTax": null, + "AllRefundTaxDeductionCommission": 0, + "ApplicableScene": "Normal", + "ExtraFee": 0, + "Flag": null, + "Note": { + "NoteCHN": "航班规定离站时间30天(含)之前免收退票手续费,航班规定离站时间前30天至7天(含)之内收取票面价20%的退票手续费,航班规定离站时间前7天至72小时(含)之内收取票面价40%的退票手续费,航班规定离站时间前72小时至4小时(含)之内收取票面价70%的退票手续费,航班规定离站时间前4小时之后收取票面价75%的退票手续费" + }, + "PTC": "ADU", + "PenneyServiceFee": 0, + "RefundFeeID": 1282653, + "RefundFeeList": [ + { + "AgencyServiceFee": 0, + "Amount": 0, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-10-30T10:40:00+08", + "EndMinute": 43200, + "FeeRate": 0, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "0001-01-01T00:00:00+08", + "StartMinute": -1, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 106, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-11-22T10:40:00+08", + "EndMinute": 10080, + "FeeRate": 0.2, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-10-30T10:40:00+08", + "StartMinute": 43200, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 212, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-11-26T10:40:00+08", + "EndMinute": 4320, + "FeeRate": 0.4, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-11-22T10:40:00+08", + "StartMinute": 10080, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 371, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-11-29T06:40:00+08", + "EndMinute": 240, + "FeeRate": 0.7, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-11-26T10:40:00+08", + "StartMinute": 4320, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 398, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "9999-12-31T08:00:00+08", + "EndMinute": -1, + "FeeRate": 0.75, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-11-29T06:40:00+08", + "StartMinute": 240, + "TaxRefund": 0, + "TimesAndFeeList": [] + } + ], + "ServiceFeeNote": null, + "ServiceFeeType": 0, + "UsedFuelDetail": null, + "UsedSalePrice": 0, + "UsedTaxAmount": 0, + "UsedTaxDetail": null + } + ], + "TargetType": "CUSTOMER" + }, + { + "Currency": "CNY", + "ExtensionInfoList": [ + { + "ApplicableScenario": "Normal", + "FeeCalculationBaseline": 0, + "PTC": "ADU", + "RefundRebookTypeList": [] + } + ], + "RebookingList": [ + { + "ApplicableScene": "Normal", + "FirstTimeFree": false, + "Flag": null, + "Note": { + "NoteCHN": "航班规定离站时间30天(含)之前免收变更手续费,航班规定离站时间前30天至7天(含)之内收取票面价10%的变更手续费,航班规定离站时间前7天至72小时(含)之内收取票面价30%的变更手续费,航班规定离站时间前72小时至4小时(含)之内收取票面价50%的变更手续费,航班规定离站时间前4小时之后收取票面价60%的变更手续费" + }, + "PTC": "ADU", + "RebookingFeeList": [ + { + "AgencyServiceFee": 0, + "Amount": 0, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-10-30T10:40:00+08", + "EndMinute": 43200, + "FeeRate": 0, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "0001-01-01T00:00:00+08", + "StartMinute": -1, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 53, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-11-22T10:40:00+08", + "EndMinute": 10080, + "FeeRate": 0.1, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-10-30T10:40:00+08", + "StartMinute": 43200, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 159, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-11-26T10:40:00+08", + "EndMinute": 4320, + "FeeRate": 0.3, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-11-22T10:40:00+08", + "StartMinute": 10080, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 265, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-11-29T06:40:00+08", + "EndMinute": 240, + "FeeRate": 0.5, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-11-26T10:40:00+08", + "StartMinute": 4320, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 318, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "9999-12-31T08:00:00+08", + "EndMinute": -1, + "FeeRate": 0.6, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-11-29T06:40:00+08", + "StartMinute": 240, + "TaxRefund": 0, + "TimesAndFeeList": [] + } + ], + "ServiceFeeNote": null + } + ], + "RefundList": [ + { + "AllRefundDeductedTax": null, + "AllRefundTaxDeductionCommission": 0, + "ApplicableScene": "Normal", + "ExtraFee": 0, + "Flag": null, + "Note": { + "NoteCHN": "航班规定离站时间30天(含)之前免收退票手续费,航班规定离站时间前30天至7天(含)之内收取票面价20%的退票手续费,航班规定离站时间前7天至72小时(含)之内收取票面价40%的退票手续费,航班规定离站时间前72小时至4小时(含)之内收取票面价70%的退票手续费,航班规定离站时间前4小时之后收取票面价75%的退票手续费" + }, + "PTC": "ADU", + "PenneyServiceFee": 0, + "RefundFeeID": 1282653, + "RefundFeeList": [ + { + "AgencyServiceFee": 0, + "Amount": 0, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-10-30T10:40:00+08", + "EndMinute": 43200, + "FeeRate": 0, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "0001-01-01T00:00:00+08", + "StartMinute": -1, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 106, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-11-22T10:40:00+08", + "EndMinute": 10080, + "FeeRate": 0.2, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-10-30T10:40:00+08", + "StartMinute": 43200, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 212, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-11-26T10:40:00+08", + "EndMinute": 4320, + "FeeRate": 0.4, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-11-22T10:40:00+08", + "StartMinute": 10080, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 371, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "2024-11-29T06:40:00+08", + "EndMinute": 240, + "FeeRate": 0.7, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-11-26T10:40:00+08", + "StartMinute": 4320, + "TaxRefund": 0, + "TimesAndFeeList": [] + }, + { + "AgencyServiceFee": 0, + "Amount": 398, + "BasePrice": 530, + "CarrierServiceFee": 0, + "CtripServiceFee": 0, + "CustomerRefund": 0, + "EndDateTime": "9999-12-31T08:00:00+08", + "EndMinute": -1, + "FeeRate": 0.75, + "FirstTimeFree": false, + "Flag": "F", + "FreeChangeTimes": 0, + "MinimumFee": 0, + "NoshowPenalty": 0, + "StartDateTime": "2024-11-29T06:40:00+08", + "StartMinute": 240, + "TaxRefund": 0, + "TimesAndFeeList": [] + } + ], + "ServiceFeeNote": null, + "ServiceFeeType": 0, + "UsedFuelDetail": null, + "UsedSalePrice": 0, + "UsedTaxAmount": 0, + "UsedTaxDetail": null + } + ], + "TargetType": "CONSOLIDATOR" + } + ], + "PenaltyPolicyFlag": 2, + "UnformattedInfo": { + "Endorse": { + "InboundFlag": null, + "InboundNote": null, + "InboundUsedFlag": null, + "InboundUsedNote": null, + "OutboundFlag": "T", + "OutboundNote": { + "NoteCHN": "不得签转。" + } + }, + "Rebook": { + "InboundFlag": null, + "InboundNote": null, + "InboundUsedFlag": null, + "InboundUsedNote": null, + "OutboundFlag": "H", + "OutboundNote": { + "NoteCHN": "航班规定离站时间30天(含)之前免收变更手续费,航班规定离站时间前30天至7天(含)之内收取票面价10%的变更手续费,航班规定离站时间前7天至72小时(含)之内收取票面价30%的变更手续费,航班规定离站时间前72小时至4小时(含)之内收取票面价50%的变更手续费,航班规定离站时间前4小时之后收取票面价60%的变更手续费" + } + }, + "Refund": { + "InboundFlag": null, + "InboundNote": null, + "InboundUsedFlag": null, + "InboundUsedNote": null, + "OutboundFlag": "H", + "OutboundNote": { + "NoteCHN": "航班规定离站时间30天(含)之前免收退票手续费,航班规定离站时间前30天至7天(含)之内收取票面价20%的退票手续费,航班规定离站时间前7天至72小时(含)之内收取票面价40%的退票手续费,航班规定离站时间前72小时至4小时(含)之内收取票面价70%的退票手续费,航班规定离站时间前4小时之后收取票面价75%的退票手续费" + } + } + } + }, + "Token": "5737445470" + } + ], + "PolicyInfo": { + "FareBasisCode": "", + "PolicyCode": "ZWF-KN普政", + "PolicyID": 282768426174595960, + "PolicyType": "10000", + "SaleType": "BusinessPriority", + "SpecialIssuingCode": "埛埛埛埛" + }, + "ReservationType": 1, + "Status": { + "Code": 0, + "Message": "Success" + }, + "TripType": 1 +} \ No newline at end of file diff --git a/c/test/detail.json b/c/test/detail.json new file mode 100644 index 0000000..4b3ad40 --- /dev/null +++ b/c/test/detail.json @@ -0,0 +1,744 @@ +{ + "datas": [ + { + "flightInfoId": "SXBHVy1Jb3FHdHR2SEJOSUNHWHRMSC10SklvR0pWTCNySTlmYkd4U05JZXt9JDUyaSRBQ3BBe2VHTHZJb295RTpvb3NFcUVxc0FwR3RKQlVySWV7fUdVVHJJb3NNcHBNdXFvcUd0VS1yS3NLcVc|", + "flightSegments": [ + { + "trip": 0, + "flyNo": "HU7187", + "index": 1949804376 + } + ], + "cabinInfos": [ + { + "left": 100, + "chdPrice": 570.0, + "adtPrice": 570.0, + "infPrice": 230.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2270.0, + "code": "U", + "ticketPrice": 570.0, + "price": 570.0, + "rulePrice": 570.0, + "oilFee": 10.0, + "fareBasisCode": "U", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2270.0, + "code": "U", + "ticketPrice": 570.0, + "price": 570.0, + "rulePrice": 570.0, + "oilFee": 20.0, + "fareBasisCode": "U", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.2511013215859031, + "priceInfoId": "v6_0_1{U}2{255}5{NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{U}2{255}5{NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 670.0, + "adtPrice": 670.0, + "infPrice": 230.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2270.0, + "code": "E", + "ticketPrice": 670.0, + "price": 670.0, + "rulePrice": 670.0, + "oilFee": 10.0, + "fareBasisCode": "ETTE220", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2270.0, + "code": "E", + "ticketPrice": 670.0, + "price": 670.0, + "rulePrice": 670.0, + "oilFee": 20.0, + "fareBasisCode": "ETTE220", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.29515418502202645, + "priceInfoId": "v6_0_1{E}2{349}5{FBR_NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{ETTE220}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{E}2{349}5{FBR_NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{ETTE220}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 730.0, + "adtPrice": 730.0, + "infPrice": 230.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2270.0, + "code": "A", + "ticketPrice": 730.0, + "price": 730.0, + "rulePrice": 730.0, + "oilFee": 10.0, + "fareBasisCode": "A", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2270.0, + "code": "A", + "ticketPrice": 730.0, + "price": 730.0, + "rulePrice": 730.0, + "oilFee": 20.0, + "fareBasisCode": "A", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.32158590308370044, + "priceInfoId": "v6_0_1{A}2{255}5{NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{A}2{255}5{NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 870.0, + "adtPrice": 870.0, + "infPrice": 230.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2270.0, + "code": "Q", + "ticketPrice": 870.0, + "price": 870.0, + "rulePrice": 870.0, + "oilFee": 10.0, + "fareBasisCode": "QTTE420", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2270.0, + "code": "Q", + "ticketPrice": 870.0, + "price": 870.0, + "rulePrice": 870.0, + "oilFee": 20.0, + "fareBasisCode": "QTTE420", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.3832599118942731, + "priceInfoId": "v6_0_1{Q}2{349}5{FBR_NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{QTTE420}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{Q}2{349}5{FBR_NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{QTTE420}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 950.0, + "adtPrice": 943.0, + "infPrice": 230.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2270.0, + "code": "N", + "ticketPrice": 950.0, + "price": 950.0, + "rulePrice": 950.0, + "oilFee": 10.0, + "fareBasisCode": "N", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2270.0, + "code": "N", + "ticketPrice": 950.0, + "price": 943.0, + "rulePrice": 950.0, + "oilFee": 20.0, + "fareBasisCode": "N", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.41541850220264315, + "priceInfoId": "v6_0_1{N}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{N}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{N}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{N}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 1090.0, + "adtPrice": 1083.0, + "infPrice": 230.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2270.0, + "code": "V", + "ticketPrice": 1090.0, + "price": 1090.0, + "rulePrice": 1090.0, + "oilFee": 10.0, + "fareBasisCode": "V", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2270.0, + "code": "V", + "ticketPrice": 1090.0, + "price": 1083.0, + "rulePrice": 1090.0, + "oilFee": 20.0, + "fareBasisCode": "V", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.47709251101321587, + "priceInfoId": "v6_0_1{V}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{V}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{V}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{V}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 1140.0, + "adtPrice": 1223.0, + "infPrice": 230.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2270.0, + "code": "Y", + "ticketPrice": 1140.0, + "price": 1140.0, + "rulePrice": 1140.0, + "oilFee": 10.0, + "fareBasisCode": "Y", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2270.0, + "code": "X", + "ticketPrice": 1230.0, + "price": 1223.0, + "rulePrice": 1230.0, + "oilFee": 20.0, + "fareBasisCode": "X", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.5387665198237885, + "priceInfoId": "v6_0_1{X}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{X}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{X}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{X}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 1140.0, + "adtPrice": 1350.0, + "infPrice": 230.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2270.0, + "code": "Y", + "ticketPrice": 1140.0, + "price": 1140.0, + "rulePrice": 1140.0, + "oilFee": 10.0, + "fareBasisCode": "Y", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2270.0, + "code": "M", + "ticketPrice": 1360.0, + "price": 1350.0, + "rulePrice": 1360.0, + "oilFee": 20.0, + "fareBasisCode": "M", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.5947136563876652, + "priceInfoId": "v6_0_1{M}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{M}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{M}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{M}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 1140.0, + "adtPrice": 1530.0, + "infPrice": 230.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2270.0, + "code": "Y", + "ticketPrice": 1140.0, + "price": 1140.0, + "rulePrice": 1140.0, + "oilFee": 10.0, + "fareBasisCode": "Y", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2270.0, + "code": "L", + "ticketPrice": 1540.0, + "price": 1530.0, + "rulePrice": 1540.0, + "oilFee": 20.0, + "fareBasisCode": "L", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.6740088105726872, + "priceInfoId": "v6_0_1{L}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{L}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{L}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{L}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 1140.0, + "adtPrice": 1720.0, + "infPrice": 230.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2270.0, + "code": "Y", + "ticketPrice": 1140.0, + "price": 1140.0, + "rulePrice": 1140.0, + "oilFee": 10.0, + "fareBasisCode": "Y", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2270.0, + "code": "K", + "ticketPrice": 1730.0, + "price": 1720.0, + "rulePrice": 1730.0, + "oilFee": 20.0, + "fareBasisCode": "K", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.7577092511013216, + "priceInfoId": "v6_0_1{K}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{K}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{K}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{K}14{}15{}16{}17{}" + }, + { + "left": 2, + "chdPrice": 1780.0, + "adtPrice": 1750.0, + "infPrice": 1060.0, + "cabins": [ + { + "baseCode": "C", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 2, + "baseCodeLevel": 3, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 10610.0, + "code": "I", + "ticketPrice": 1780.0, + "price": 1780.0, + "rulePrice": 1780.0, + "oilFee": 10.0, + "fareBasisCode": "I", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 10610.0, + "code": "I", + "ticketPrice": 1780.0, + "price": 1750.0, + "rulePrice": 1780.0, + "oilFee": 20.0, + "fareBasisCode": "I", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.1649387370405278, + "priceInfoId": "v6_0_1{I}2{255}5{NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{I}2{255}5{NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 1140.0, + "adtPrice": 1895.0, + "infPrice": 230.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2270.0, + "code": "Y", + "ticketPrice": 1140.0, + "price": 1140.0, + "rulePrice": 1140.0, + "oilFee": 10.0, + "fareBasisCode": "Y", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2270.0, + "code": "H", + "ticketPrice": 1910.0, + "price": 1895.0, + "rulePrice": 1910.0, + "oilFee": 20.0, + "fareBasisCode": "H", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.8348017621145375, + "priceInfoId": "v6_0_1{H}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{H}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{H}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{H}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 1140.0, + "adtPrice": 2255.0, + "infPrice": 230.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2270.0, + "code": "Y", + "ticketPrice": 1140.0, + "price": 1140.0, + "rulePrice": 1140.0, + "oilFee": 10.0, + "fareBasisCode": "Y", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2270.0, + "code": "Y", + "ticketPrice": 2270.0, + "price": 2255.0, + "rulePrice": 2270.0, + "oilFee": 20.0, + "fareBasisCode": "Y", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.9933920704845814, + "priceInfoId": "v6_0_1{Y}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{Y}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{Y}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{Y}14{}15{}16{}17{}" + }, + { + "left": 3, + "chdPrice": 4640.0, + "adtPrice": 4610.0, + "infPrice": 1060.0, + "cabins": [ + { + "baseCode": "C", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 3, + "baseCodeLevel": 3, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 10610.0, + "code": "Z", + "ticketPrice": 4640.0, + "price": 4640.0, + "rulePrice": 4640.0, + "oilFee": 10.0, + "fareBasisCode": "Z", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 10610.0, + "code": "Z", + "ticketPrice": 4640.0, + "price": 4610.0, + "rulePrice": 4640.0, + "oilFee": 20.0, + "fareBasisCode": "Z", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.4344957587181904, + "priceInfoId": "v6_0_1{Z}2{255}5{NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{Z}2{255}5{NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{}14{}15{}16{}17{}" + }, + { + "left": 4, + "chdPrice": 5310.0, + "adtPrice": 6640.0, + "infPrice": 1060.0, + "cabins": [ + { + "baseCode": "C", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 4, + "baseCodeLevel": 3, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 10610.0, + "code": "C", + "ticketPrice": 5310.0, + "price": 5310.0, + "rulePrice": 5310.0, + "oilFee": 10.0, + "fareBasisCode": "C", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 10610.0, + "code": "D", + "ticketPrice": 6670.0, + "price": 6640.0, + "rulePrice": 6670.0, + "oilFee": 20.0, + "fareBasisCode": "D", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.6258246936852027, + "priceInfoId": "v6_0_1{D}2{255}5{NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{D}2{255}5{NET}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{}14{}15{}16{}17{}" + }, + { + "left": 6, + "chdPrice": 5310.0, + "adtPrice": 10560.0, + "infPrice": 1060.0, + "cabins": [ + { + "baseCode": "C", + "expectTicketTime": 10, + "flyNo": "HU7187", + "left": 6, + "baseCodeLevel": 3, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 10610.0, + "code": "C", + "ticketPrice": 5310.0, + "price": 5310.0, + "rulePrice": 5310.0, + "oilFee": 10.0, + "fareBasisCode": "C", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 10610.0, + "code": "C", + "ticketPrice": 10610.0, + "price": 10560.0, + "rulePrice": 10610.0, + "oilFee": 20.0, + "fareBasisCode": "C", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.9952874646559849, + "priceInfoId": "v6_0_1{C}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{C}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{C}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{C}14{}15{}16{}17{}" + } + ] + } + ], + "flightInfos": [ + { + "showModel": "波音738", + "flyNo": "HU7187", + "distance": 1057, + "isStop": 0, + "arrCode": "WUH", + "index": 1949804376, + "depCode": "PEK", + "airportFee": 50.0, + "meal": 8, + "flightInfoId": "SXBHVy1Jb3FHdHR2SEJOSUNHWHRMSC10SklvR0pWTCNySTlmYkd4U05JZXt9JDUyaSRBQ3BBe2VHTHZJb295RTpvb3NFcUVxc0FwR3RKQlVySWV7fUdVVHJJb3NNcHBNdXFvcUd0VS1yS3NLcVc|", + "arrCityCode": "WUH", + "acCode": "HU", + "arrDateTime": "2024-11-30 11:55", + "oilFee": 20.0, + "isShare": 0, + "depTerminal": "T2", + "arrTerminal": "T2", + "depCityCode": "BJS", + "depDateTime": "2024-11-30 09:15" + } + ], + "status": 0 +} \ No newline at end of file diff --git a/c/test/guan.json b/c/test/guan.json new file mode 100644 index 0000000..962dea7 --- /dev/null +++ b/c/test/guan.json @@ -0,0 +1 @@ +{tickets=[{idType=0, flyNo=HU7187, ticketPrice=950.0, arrCode=WUH, idCard=510602196203185969, cabin=N, depCode=PEK, airportFee=50.0, baseCabin=Y, pnr=ADT000, price=943.0, arrDateTime=2024-11-30 11:55, oilFee=20.0, name=马爱萍, ticketId=1067746928038707200, depDateTime=2024-11-30 09:15}], orderId=D24330100505488672, totalPrice=1013.0, noticeType=11} \ No newline at end of file diff --git a/c/test/list.json b/c/test/list.json new file mode 100644 index 0000000..4a64748 --- /dev/null +++ b/c/test/list.json @@ -0,0 +1,629 @@ +{ + "msg": "success", + "traceId": "190f6424eb5176aa", + "code": 1, + "data": { + "datas": [ + { + "flightInfoId": "SXBHVy1Jb3FHdHR2SEJOSXVHWHRMSC10SklvR0pWTCNySTlmYkd4U05JMGU5JDUyaSRvcXB3ezZHTHZJb29wQzpvb3lzQ0Nvc0FwR3RKQlVySTBlOUdVVHJJeW9NcHBNdXFvcUd0VS1yS3NLcVc|", + "flightSegments": [ + { + "trip": 0, + "flyNo": "MU5120", + "index": 2068794492 + } + ], + "cabinInfos": [ + { + "left": 100, + "adtPrice": 1830.0, + "infPrice": 220.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "MU5120", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2150.0, + "code": "M", + "ticketPrice": 1830.0, + "price": 1830.0, + "rulePrice": 1830.0, + "oilFee": 20.0, + "fareBasisCode": "aabbcc", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.8511627906976744, + "saleControls": [ + { + "newMember": 1, + "hasAge": "[22,44]", + "psAge": "", + "psIdType": "0", + "psIdNo": "42*", + "id": 754, + "psGender": "2" + } + ], + "priceInfoId": "v6_0_1{M}2{119}5{TESTTEST}6{Ti1CWUx0dg||}7{TESTTEST}8{hlth}9{ALLTPALL}10{_00Fj5IBIstGRKHeMLyk}11{}13{aabbcc}14{M}15{PUB}16{pubibe}17{}" + } + ], + "priceInfoId": "v6_0_1{M}2{119}5{TESTTEST}6{Ti1CWUx0dg||}7{TESTTEST}8{hlth}9{ALLTPALL}10{_00Fj5IBIstGRKHeMLyk}11{}13{aabbcc}14{M}15{PUB}16{pubibe}17{}" + }, + { + "left": 100, + "chdPrice": 1080.0, + "adtPrice": 2130.0, + "infPrice": 220.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "MU5120", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2150.0, + "code": "Y", + "ticketPrice": 1080.0, + "price": 1080.0, + "rulePrice": 1080.0, + "oilFee": 10.0, + "fareBasisCode": "Y", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2150.0, + "code": "B", + "ticketPrice": 2130.0, + "price": 2130.0, + "rulePrice": 2130.0, + "oilFee": 20.0, + "fareBasisCode": "B", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.9906976744186047, + "saleControls": [ + { + "newMember": 1, + "hasAge": "[22,44]", + "psAge": "", + "psIdType": "0", + "psIdNo": "42*", + "id": 754, + "psGender": "2" + } + ], + "priceInfoId": "v6_0_1{B}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{B}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{B}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{B}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 1080.0, + "adtPrice": 2150.0, + "infPrice": 220.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "MU5120", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2150.0, + "code": "Y", + "ticketPrice": 1080.0, + "price": 1080.0, + "rulePrice": 1080.0, + "oilFee": 10.0, + "fareBasisCode": "Y", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2150.0, + "code": "Y", + "ticketPrice": 2150.0, + "price": 2150.0, + "rulePrice": 2150.0, + "oilFee": 20.0, + "fareBasisCode": "Y", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 1.0, + "saleControls": [ + { + "newMember": 1, + "hasAge": "[22,44]", + "psAge": "", + "psIdType": "0", + "psIdNo": "42*", + "id": 754, + "psGender": "2" + } + ], + "priceInfoId": "v6_0_1{Y}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{Y}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{Y}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{Y}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 1080.0, + "adtPrice": 2150.0, + "infPrice": 220.0, + "cabins": [ + { + "baseCode": "W", + "expectTicketTime": 10, + "flyNo": "MU5120", + "left": 100, + "baseCodeLevel": 4, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 2150.0, + "code": "W", + "ticketPrice": 1080.0, + "price": 1080.0, + "rulePrice": 1080.0, + "oilFee": 10.0, + "fareBasisCode": "W", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2150.0, + "code": "W", + "ticketPrice": 2150.0, + "price": 2150.0, + "rulePrice": 2150.0, + "oilFee": 20.0, + "fareBasisCode": "W", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 1.0, + "saleControls": [ + { + "newMember": 1, + "hasAge": "[22,44]", + "psAge": "", + "psIdType": "0", + "psIdNo": "42*", + "id": 754, + "psGender": "2" + } + ], + "priceInfoId": "v6_0_1{W}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{W}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{W}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{W}14{}15{}16{}17{}" + }, + { + "left": 100, + "chdPrice": 2800.0, + "adtPrice": 2800.0, + "infPrice": 840.0, + "cabins": [ + { + "baseCode": "J", + "expectTicketTime": 10, + "flyNo": "MU5120", + "left": 100, + "baseCodeLevel": 3, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 8390.0, + "code": "I", + "ticketPrice": 2800.0, + "price": 2800.0, + "rulePrice": 2800.0, + "oilFee": 10.0, + "fareBasisCode": "I", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 8390.0, + "code": "I", + "ticketPrice": 2800.0, + "price": 2800.0, + "rulePrice": 2800.0, + "oilFee": 20.0, + "fareBasisCode": "I", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.33373063170441003, + "saleControls": [ + { + "newMember": 1, + "hasAge": "[22,44]", + "psAge": "", + "psIdType": "0", + "psIdNo": "42*", + "id": 754, + "psGender": "2" + } + ], + "priceInfoId": "v6_0_1{I}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{I}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{I}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{I}14{}15{}16{}17{}" + }, + { + "left": 100, + "adtPrice": 3230.0, + "cabins": [ + { + "baseCode": "J", + "expectTicketTime": 10, + "flyNo": "MU5120", + "left": 100, + "baseCodeLevel": 3, + "voucher": "0", + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 8390.0, + "code": "Q", + "ticketPrice": 3230.0, + "price": 3230.0, + "rulePrice": 3230.0, + "oilFee": 20.0, + "fareBasisCode": "aabbcc", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.38498212157330153, + "saleControls": [ + { + "newMember": 1, + "hasAge": "[22,44]", + "psAge": "", + "psIdType": "0", + "psIdNo": "42*", + "id": 754, + "psGender": "2" + } + ], + "priceInfoId": "v6_0_1{Q}2{119}5{TESTTEST}6{Ti1CWUx0dg||}7{TESTTEST}8{hlth}9{ALLTPALL}10{_00Fj5IBIstGRKHeMLyk}11{}13{aabbcc}14{Q}15{PUB}16{pubibe}17{}" + } + ], + "priceInfoId": "v6_0_1{Q}2{119}5{TESTTEST}6{Ti1CWUx0dg||}7{TESTTEST}8{hlth}9{ALLTPALL}10{_00Fj5IBIstGRKHeMLyk}11{}13{aabbcc}14{Q}15{PUB}16{pubibe}17{}" + }, + { + "left": 100, + "adtPrice": 3870.0, + "infPrice": 840.0, + "cabins": [ + { + "baseCode": "J", + "expectTicketTime": 10, + "flyNo": "MU5120", + "left": 100, + "baseCodeLevel": 3, + "voucher": "0", + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 8390.0, + "code": "D", + "ticketPrice": 3870.0, + "price": 3870.0, + "rulePrice": 3870.0, + "oilFee": 20.0, + "fareBasisCode": "aabbcc", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.4612634088200238, + "saleControls": [ + { + "newMember": 1, + "hasAge": "[22,44]", + "psAge": "", + "psIdType": "0", + "psIdNo": "42*", + "id": 754, + "psGender": "2" + } + ], + "priceInfoId": "v6_0_1{D}2{119}5{TESTTEST}6{Ti1CWUx0dg||}7{TESTTEST}8{hlth}9{ALLTPALL}10{_00Fj5IBIstGRKHeMLyk}11{}13{aabbcc}14{D}15{PUB}16{pubibe}17{}" + } + ], + "priceInfoId": "v6_0_1{D}2{119}5{TESTTEST}6{Ti1CWUx0dg||}7{TESTTEST}8{hlth}9{ALLTPALL}10{_00Fj5IBIstGRKHeMLyk}11{}13{aabbcc}14{D}15{PUB}16{pubibe}17{}" + }, + { + "left": 100, + "chdPrice": 4200.0, + "adtPrice": 5380.0, + "infPrice": 840.0, + "cabins": [ + { + "baseCode": "J", + "expectTicketTime": 10, + "flyNo": "MU5120", + "left": 100, + "baseCodeLevel": 3, + "voucher": "0", + "chdPrice": { + "airportFee": 0.0, + "basisPrice": 8390.0, + "code": "J", + "ticketPrice": 4200.0, + "price": 4200.0, + "rulePrice": 4200.0, + "oilFee": 10.0, + "fareBasisCode": "J", + "rule": {}, + "productType": "pd" + }, + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 8390.0, + "code": "C", + "ticketPrice": 5380.0, + "price": 5380.0, + "rulePrice": 5380.0, + "oilFee": 20.0, + "fareBasisCode": "C", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.6412395709177592, + "saleControls": [ + { + "newMember": 1, + "hasAge": "[22,44]", + "psAge": "", + "psIdType": "0", + "psIdNo": "42*", + "id": 754, + "psGender": "2" + } + ], + "priceInfoId": "v6_0_1{C}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{C}14{}15{}16{}17{}" + } + ], + "priceInfoId": "v6_0_1{C}2{254}5{PUB}6{Ti1CWUx0dg||}7{}8{}9{}10{}11{}13{C}14{}15{}16{}17{}" + }, + { + "left": 100, + "adtPrice": 8390.0, + "infPrice": 840.0, + "cabins": [ + { + "baseCode": "J", + "expectTicketTime": 10, + "flyNo": "MU5120", + "left": 100, + "baseCodeLevel": 3, + "voucher": "0", + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 8390.0, + "code": "J", + "ticketPrice": 8390.0, + "price": 8390.0, + "rulePrice": 8390.0, + "oilFee": 20.0, + "fareBasisCode": "aabbcc", + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 1.0, + "saleControls": [ + { + "newMember": 1, + "hasAge": "[22,44]", + "psAge": "", + "psIdType": "0", + "psIdNo": "42*", + "id": 754, + "psGender": "2" + } + ], + "priceInfoId": "v6_0_1{J}2{119}5{TESTTEST}6{Ti1CWUx0dg||}7{TESTTEST}8{hlth}9{ALLTPALL}10{_00Fj5IBIstGRKHeMLyk}11{}13{aabbcc}14{J}15{PUB}16{pubibe}17{}" + } + ], + "priceInfoId": "v6_0_1{J}2{119}5{TESTTEST}6{Ti1CWUx0dg||}7{TESTTEST}8{hlth}9{ALLTPALL}10{_00Fj5IBIstGRKHeMLyk}11{}13{aabbcc}14{J}15{PUB}16{pubibe}17{}" + } + ] + }, + { + "flightInfoId": "SXBHVy1Jb3FHdHR2SEJOSUFHWHRMSC10SklvR0pWTCNySTlmYkd4U05JMGU5JDUyaSRBb3lBe2VHTHZJb29DQTpvb3V3Q0Nvc0FwR3RKQlVySTBlOUdVVHJJeW9NcHBNdXFvcUd0VS1yS3NLcVc|", + "flightSegments": [ + { + "trip": 0, + "flyNo": "HU7607", + "index": 1506511626 + } + ], + "cabinInfos": [ + { + "left": 100, + "adtPrice": 1710.0, + "infPrice": 220.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7607", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2150.0, + "code": "H", + "ticketPrice": 1710.0, + "price": 1710.0, + "rulePrice": 1710.0, + "oilFee": 20.0, + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.7953488372093023, + "saleControls": [ + { + "psType": "ADT", + "id": 663 + } + ], + "priceInfoId": "v6_0_1{H}2{119}5{HUTESTTEST2}6{Ti1CWUx0dg||}7{HUTESTTEST2}8{hlth}9{ALLTPALL}10{HFDeuJIBo5JPM7SKeuuv}11{}13{}14{H}15{PUB}16{pubibe}17{}" + } + ], + "priceInfoId": "v6_0_1{H}2{119}5{HUTESTTEST2}6{Ti1CWUx0dg||}7{HUTESTTEST2}8{hlth}9{ALLTPALL}10{HFDeuJIBo5JPM7SKeuuv}11{}13{}14{H}15{PUB}16{pubibe}17{}" + }, + { + "left": 100, + "adtPrice": 2050.0, + "infPrice": 220.0, + "cabins": [ + { + "baseCode": "Y", + "expectTicketTime": 10, + "flyNo": "HU7607", + "left": 100, + "baseCodeLevel": 1, + "voucher": "0", + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 2150.0, + "code": "Y", + "ticketPrice": 2050.0, + "price": 2050.0, + "rulePrice": 2050.0, + "oilFee": 20.0, + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.9534883720930233, + "saleControls": [ + { + "hasAge": "", + "psAge": "", + "psIdType": "0", + "id": 668 + } + ], + "priceInfoId": "v6_0_1{Y}2{119}5{HUTESTTEST1}6{Ti1CWUx0dg||}7{HUTESTTEST1}8{hlth}9{ALLTPALL}10{G1DeuJIBo5JPM7SKeuuv}11{}13{}14{Y}15{PUB}16{pubibe}17{}" + } + ], + "priceInfoId": "v6_0_1{Y}2{119}5{HUTESTTEST1}6{Ti1CWUx0dg||}7{HUTESTTEST1}8{hlth}9{ALLTPALL}10{G1DeuJIBo5JPM7SKeuuv}11{}13{}14{Y}15{PUB}16{pubibe}17{}" + }, + { + "left": 100, + "adtPrice": 8290.0, + "infPrice": 840.0, + "cabins": [ + { + "baseCode": "C", + "expectTicketTime": 10, + "flyNo": "HU7607", + "left": 100, + "baseCodeLevel": 3, + "voucher": "0", + "adtPrice": { + "airportFee": 50.0, + "basisPrice": 8390.0, + "code": "C", + "ticketPrice": 8290.0, + "price": 8290.0, + "rulePrice": 8290.0, + "oilFee": 20.0, + "rule": {}, + "productType": "pd" + }, + "index": 0, + "discount": 0.9880810488676997, + "saleControls": [ + { + "psType": "ADT", + "id": 663 + } + ], + "priceInfoId": "v6_0_1{C}2{119}5{HUTESTTEST2}6{Ti1CWUx0dg||}7{HUTESTTEST2}8{hlth}9{ALLTPALL}10{HFDeuJIBo5JPM7SKeuuv}11{}13{}14{C}15{PUB}16{pubibe}17{}" + } + ], + "priceInfoId": "v6_0_1{C}2{119}5{HUTESTTEST2}6{Ti1CWUx0dg||}7{HUTESTTEST2}8{hlth}9{ALLTPALL}10{HFDeuJIBo5JPM7SKeuuv}11{}13{}14{C}15{PUB}16{pubibe}17{}" + } + ] + } + ], + "flightInfos": [ + { + "showModel": "波音744(大)", + "flyNo": "CA1507", + "isStop": 0, + "arrCode": "SHA", + "index": -2118633377, + "depCode": "PEK", + "airportFee": 50.0, + "meal": 1, + "flightInfoId": "SXBHVy1Jb3FHdHR2SEJOSXBHWHRMSC10SklvR0pWTCNySTlmYkd4U05JMGU5JDUyaSRBb3dwMDFHTHZJb29BQzpvb3VFdUNvc0FwR3RKQlVySTBlOUdVVHJJeW9NcHBNdXFvcUd0VS1yS3NLcVc|", + "arrCityCode": "SHA", + "acCode": "CA", + "arrDateTime": "2024-11-06 09:55", + "oilFee": 20.0, + "isShare": 0, + "depTerminal": "T3", + "arrTerminal": "T2", + "depCityCode": "BJS", + "depDateTime": "2024-11-06 07:30" + }, + { + "showModel": "空客336(大)", + "flyNo": "HU7609", + "isStop": 0, + "arrCode": "SHA", + "index": -81121318, + "depCode": "PEK", + "airportFee": 50.0, + "meal": 8, + "flightInfoId": "SXBHVy1Jb3FHdHR2SEJOSUNHWHRMSC10SklvR0pWTCNySTlmYkd4U05JMGU5JDUyaSRFb3lBe2VHTHZJb29BQzpvb0V3RUNvc0FwR3RKQlVySTBlOUdVVHJJeW9NcHBNdXFvcUd0VS1yS3NLcVc|", + "arrCityCode": "SHA", + "acCode": "HU", + "arrDateTime": "2024-11-06 22:50", + "oilFee": 20.0, + "isShare": 0, + "depTerminal": "T2", + "arrTerminal": "T2", + "depCityCode": "BJS", + "depDateTime": "2024-11-06 20:25" + } + ], + "status": 0 + }, + "success": true +} \ No newline at end of file diff --git a/c/test/order.json b/c/test/order.json new file mode 100644 index 0000000..af93976 --- /dev/null +++ b/c/test/order.json @@ -0,0 +1,32 @@ +{ + "passengers": [ + { + "birthday": "1980-08-04", + "idType": "0", + "gender": "1", + "phone": "13837313963", + "idCard": "410782198008044995", + "name": "测试", + "phoneCode": "86", + "type": "ADT", + "countryType": "domestic", + "chinesepinyin": [ + { + "name": "测", + "isFirstName": "1", + "value": "CE" + }, + { + "name": "试", + "isFirstName": "0", + "value": "SHI" + } + ] + } + ], + "contactEmail": "344656718@qq.com", + "contactName": "测试姓名", + "companyName": "乖乖公司", + "context": "74ab25ffbd0a170753d8b463a73808a8", + "contactPhone": "13520830938" +} \ No newline at end of file diff --git a/c/test/ticket.json b/c/test/ticket.json new file mode 100644 index 0000000..2bfc5ea --- /dev/null +++ b/c/test/ticket.json @@ -0,0 +1 @@ +{actionType=1, tickets=[{passengerName=赵恒飞, idType=0, ticketPrice=950.0, idCard=410922199709110931, cabin=N, settlePrice=943.0, eticket=732-5894024890, airportFee=50.0, baseCabin=Y, ticketTime=2024-11-26 10:50:07, pnr=ADT000, oilFee=20.0, ticketStatus=2, eticketStatus=OPEN_FOR_USE, failCode=1, failMsg=, ticketId=1068118464838959105}], orderId=D24331104126486076, outTradeNo=FLY856P2433110412749700093, action=1, secondIssue=false, noticeType=1} \ No newline at end of file diff --git a/c/test/tongdata.json b/c/test/tongdata.json new file mode 100644 index 0000000..27c3d89 --- /dev/null +++ b/c/test/tongdata.json @@ -0,0 +1 @@ +{"msg":"success","traceId":"a0a349d4f001337a","code":1,"data":{"context":"7ab4169218ffaaa620b0aefba9f52ae1","selectCabin":{"chdPrice":{"airportFee":0.0,"priceCode":"BFD","ticketPrice":950.0,"price":950.0,"rulePrice":950.0,"oilFee":10.0,"otherFee":0.0,"rule":{"changeRule":"航班起飞前,免费变更;航班起飞后,收取票面价50%(475元)改期费","refundRule":"航班起飞前168小时(含)之前,收取票面价5%(48元)退票费;航班起飞前168小时(不含)之内至72小时(含)之前,收取票面价5%(48元)退票费;航班起飞前72小时(不含)之内至4小时(含)之前,收取票面价5%(48元)退票费;航班起飞前4小时(不含)之内及航班起飞后,收取票面价10%(95元)退票费","transferRule":""},"seats":[{"baseCabin":"Y","airportFee":0.0,"fare":950.0,"left":100,"fareBasisCode":"N","oilFee":10.0,"cabin":"N","discount":0.42,"rule":{"changeRule":"航班起飞前,免费变更;航班起飞后,收取票面价50%(475元)改期费","refundRule":"航班起飞前168小时(含)之前,收取票面价5%(48元)退票费;航班起飞前168小时(不含)之内至72小时(含)之前,收取票面价5%(48元)退票费;航班起飞前72小时(不含)之内至4小时(含)之前,收取票面价5%(48元)退票费;航班起飞前4小时(不含)之内及航班起飞后,收取票面价10%(95元)退票费","transferRule":""},"flightKey":"HU7187$PEK$WUH"}]},"adtPrice":{"airportFee":50.0,"priceCode":"BFD","ticketPrice":950.0,"price":943.0,"rulePrice":950.0,"oilFee":20.0,"otherFee":0.0,"rule":{"changeRule":"航班起飞前,免费变更;航班起飞后,收取票面价50%(475元)改期费","refundRule":"航班起飞前168小时(含)之前,收取票面价5%(48元)退票费;航班起飞前168小时(不含)之内至72小时(含)之前,收取票面价5%(48元)退票费;航班起飞前72小时(不含)之内至4小时(含)之前,收取票面价5%(48元)退票费;航班起飞前4小时(不含)之内及航班起飞后,收取票面价10%(95元)退票费","transferRule":""},"seats":[{"baseCabin":"Y","airportFee":50.0,"fare":943.0,"ticketPrice":950.0,"left":100,"fareBasisCode":"N","oilFee":20.0,"rulePrice":950.0,"cabin":"N","discount":0.42,"rule":{"changeRule":"航班起飞前,免费变更;航班起飞后,收取票面价50%(475元)改期费","refundRule":"航班起飞前168小时(含)之前,收取票面价5%(48元)退票费;航班起飞前168小时(不含)之内至72小时(含)之前,收取票面价5%(48元)退票费;航班起飞前72小时(不含)之内至4小时(含)之前,收取票面价5%(48元)退票费;航班起飞前4小时(不含)之内及航班起飞后,收取票面价10%(95元)退票费","transferRule":""},"flightKey":"HU7187$PEK$WUH"}]},"infPrice":{"airportFee":0.0,"priceCode":"BFD","ticketPrice":230.0,"price":230.0,"rulePrice":230.0,"oilFee":0.0,"otherFee":0.0,"rule":{"changeRule":"免费改期","refundRule":"免费退票"},"seats":[{"baseCabin":"Y","airportFee":0.0,"fare":230.0,"left":100,"fareBasisCode":"N","oilFee":0.0,"cabin":"N","discount":0.1,"rule":{"changeRule":"免费改期","refundRule":"免费退票"},"flightKey":"HU7187$PEK$WUH"}]}},"flights":[{"flyNo":"HU7187","arrCode":"WUH","flightKey":"HU7187$PEK$WUH","depCode":"PEK","arrCityCode":"WUH","acCode":"HU","arrDateTime":"2024-11-30 11:55","isShare":0,"depTerminal":"T2","arrTerminal":"T2","model":"波音738(中)","depCityCode":"BJS","depDateTime":"2024-11-30 09:15"}]},"success":true} \ No newline at end of file diff --git a/c/test/xiedata.json b/c/test/xiedata.json new file mode 100644 index 0000000..a5fd4a9 --- /dev/null +++ b/c/test/xiedata.json @@ -0,0 +1 @@ +{"Status":{"Message":"Success","Code":0},"TotalCount":1,"UnissuedTicketInfo":[{"IssuingDetailList":[{"MarketingFlightNo":"HU7192","DepartureDateTime":"2025-01-25 13:50:00","RBD":"H","PassengerName":"杨淑娟","AccountPrice":2148.900000,"DepartureAirportCode":"XMN","Birthdate":"1970-02-16","ArrivalAirportCode":"PEK","PTC":"ADU","SegmentNo":1},{"MarketingFlightNo":"HU7192","DepartureDateTime":"2025-01-25 13:50:00","RBD":"H","PassengerName":"林晓霞","AccountPrice":2148.900000,"DepartureAirportCode":"XMN","Birthdate":"1970-06-04","ArrivalAirportCode":"PEK","PTC":"ADU","SegmentNo":1},{"MarketingFlightNo":"HU7192","DepartureDateTime":"2025-01-25 13:50:00","RBD":"H","PassengerName":"佐长利","AccountPrice":2148.900000,"DepartureAirportCode":"XMN","Birthdate":"1971-10-12","ArrivalAirportCode":"PEK","PTC":"ADU","SegmentNo":1},{"MarketingFlightNo":"HU7192","DepartureDateTime":"2025-01-25 13:50:00","RBD":"H","PassengerName":"林晓莉","AccountPrice":2148.900000,"DepartureAirportCode":"XMN","Birthdate":"1973-03-10","ArrivalAirportCode":"PEK","PTC":"ADU","SegmentNo":1},{"MarketingFlightNo":"HU7192","DepartureDateTime":"2025-01-25 13:50:00","RBD":"H","PassengerName":"佐丹","AccountPrice":2148.900000,"DepartureAirportCode":"XMN","Birthdate":"1990-02-05","ArrivalAirportCode":"PEK","PTC":"ADU","SegmentNo":1},{"MarketingFlightNo":"HU7192","DepartureDateTime":"2025-01-25 13:50:00","RBD":"H","PassengerName":"林杨","AccountPrice":2148.900000,"DepartureAirportCode":"XMN","Birthdate":"1994-04-11","ArrivalAirportCode":"PEK","PTC":"ADU","SegmentNo":1}],"UrgeTimes":0,"IssuingID":3133133627,"CancelIssuingStatus":0,"IssuingAttributeList":["HaveBaggage"],"EnterSystemDateTime":"2024-11-21 16:17:38","EmailRequiredFlag":0,"IssuingDateTimeLimit":"2024-11-21 17:17:38","IssuingOperator":"深圳华中","RouteType":"N","PNR":"JVGKSG","IssuingStatus":1,"PolicyCode":"HYY-HU普政","Urgency":6}]} \ No newline at end of file diff --git a/read.md b/read.md new file mode 100644 index 0000000..2671ae6 --- /dev/null +++ b/read.md @@ -0,0 +1 @@ +72c2c34e70e9664fd9d0157d871bb930346f0ec1 \ No newline at end of file