|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- // Kadane算法
- // 找到以M = a[i]为结尾的序列和最大值
- // 将x = a[i + 1]和之前的最大值求和
- // 则以x为结尾的最大和序列:[M, x]或[x]
- int Get_max_sum_array(int a[], int size, int *pbegin, int *pend)
- {
- int max_sum = a[0];
- int sum = a[0];
- int begin = 0;
- int end = 0;
- for (int i = 1; i < size; i++) // end就是当前元素
- {
- if (a[i] + sum >= a[i]) // 继续
- {
- sum += a[i];
- }
- else // 更新起点
- {
- begin = i;
- sum = a[i];
- }
- end = i;
- if (sum > max_sum) // 更新最大
- {
- max_sum = sum;
- *pbegin = begin;
- *pend = end;
- }
- }
- return max_sum;
- }
- // 找出和最大的子序列
- int main()
- {
- int lines = 0;
- scanf("%d", &lines);
- // 为结果申请空间
- int** presult = (int**)malloc(sizeof(int*) * lines);
- for (int i = 0; i < lines; i++)
- {
- *(presult + i) = (int*)malloc(3 * sizeof(int));
- }
- int num = 0; // 读入的数字
- int count = 0; // 一行的数字数量
- int n = 0; // 当前处理的行数
- for (int n = 0; n < lines; n++)
- {
- scanf("%d", &count);
- int* pa = (int*)malloc(count * sizeof(int)); // 分配当前行空间
- for (int i = 0; i < count; i++)
- {
- if (scanf("%d", &num) != EOF)
- {
- *(pa + i) = num;
- }
- }
- // 处理数据
- int max_sum = 0;
- int begin = 0;
- int end = 0;
- max_sum = Get_max_sum_array(pa, count, &begin, &end);
- // 释放空间
- free(pa);
- // 记录结果
- *(*(presult + n) + 1) = max_sum;
- *(*(presult + n) + 2) = begin + 1;
- *(*(presult + n) + 3) = end + 1;
- }
- // 统一输出结果
- for (int i = 0; i < lines; i++)
- {
- printf("Case %d:\n", i + 1);
- printf("%d %d %d\n", *(*(presult + i) + 1), *(*(presult + i) + 2), *(*(presult + i) + 3));
- if (i != lines - 1)
- {
- putchar('\n');
- }
- }
- for (int i = 0; i < lines; i++)
- {
- int* p = *(presult + i);
- free(p);
- }
- return 0;
- }
复制代码
C:\Users\user_xk\Desktop
指针数组presult的空间释放不是遍历释放每一个指针,再释放自身吗
但是,当我把中间代码删除后,又没有报错了,感觉很奇怪
- int main()
- {
- int lines = 0;
- scanf("%d", &lines);
- // 为结果申请空间
- int** presult = (int**)malloc(sizeof(int*) * lines);
- for (int i = 0; i < lines; i++)
- {
- *(presult + i) = (int*)malloc(3 * sizeof(int));
- }
- for (int i = 0; i < lines; i++)
- {
- int* p = *(presult + i);
- free(p);
- }
- free(presult);
- return 0;
- }
复制代码
你代码中有几个地方需要修改和注意。首先,让我们来解决你遇到的问题。
1. 在 `Get_max_sum_array` 函数中的参数应该是数组 `int *a` 而不是单个整数。
2. 记录结果时,你使用的是索引从1开始,而数组索引应从0开始。
3. 最后,你没有释放 `presult` 整体的空间。
以下是修正后的代码:
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- // Kadane算法
- // 找到以M为结尾的序列和最大值
- int Get_max_sum_array(int *a, int size, int *pbegin, int *pend)
- {
- int max_sum = a[0];
- int sum = a[0];
- int begin = 0;
- int end = 0;
- for (int i = 1; i < size; i++)
- {
- if (sum >= 0)
- {
- sum += a[i];
- }
- else
- {
- begin = i;
- sum = a[i];
- }
- end = i;
- if (sum > max_sum)
- {
- max_sum = sum;
- *pbegin = begin;
- *pend = end;
- }
- }
- return max_sum;
- }
- // 找出和最大的子序列
- int main()
- {
- int lines = 0;
- scanf("%d", &lines);
- // 为结果申请空间
- int** presult = (int**)malloc(sizeof(int*) * lines);
- for (int i = 0; i < lines; i++)
- {
- presult[i] = (int*)malloc(3 * sizeof(int));
- }
- int num = 0; // 读入的数字
- int count = 0; // 一行的数字数量
- for (int n = 0; n < lines; n++)
- {
- scanf("%d", &count);
- int* pa = (int*)malloc(count * sizeof(int)); // 分配当前行空间
- for (int i = 0; i < count; i++)
- {
- if (scanf("%d", &num) != EOF)
- {
- pa[i] = num;
- }
- }
- // 处理数据
- int max_sum = 0;
- int begin = 0;
- int end = 0;
- max_sum = Get_max_sum_array(pa, count, &begin, &end);
- // 记录结果
- presult[n][0] = max_sum;
- presult[n][1] = begin + 1;
- presult[n][2] = end + 1;
- // 释放空间
- free(pa);
- }
- // 统一输出结果
- for (int i = 0; i < lines; i++)
- {
- printf("Case %d:\n", i + 1);
- printf("%d %d %d\n", presult[i][0], presult[i][1], presult[i][2]);
- if (i != lines - 1)
- {
- putchar('\n');
- }
- }
- for (int i = 0; i < lines; i++)
- {
- free(presult[i]);
- }
- free(presult);
- return 0;
- }
复制代码
此代码修正了原代码中的问题并确保正确释放内存。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|