这个作业要求在哪里 | https://edu.cnblogs.com/campus/jssf/infor_computation17-31/homework/10454 |
---|---|
我的课程目标 | 学习一些编程语言,并完成单元测试 |
此作业在哪个具体方面帮我实现目标 | 代码的运行 |
其他参考文献 | 无 |
作业正文 | 无 |
正文
单元测试
数组中最大子数组的和。
用类/函数来实现
需求:希望返回 3 种信息
最大子数组的和
最大子数组开始的下标
最大子数组结束的下标
从文本文件中读输入的数据,熟悉文件操作, 文件有两种数据
第一个数字:这次测试中有多少个数据, 数字后面是冒号。
后续数字: 每个数据的值,用逗号隔开
比如
文件内容:
17: -32, -10, 33, -23, 32, -12, 41, -12, 1, 3, 5, -98, 70, -21, 10, -9, 61
输出
sum = 71
#include<stdio.h>
#include<stdlib.h>
int *FindMaxCrossSubarray(int A[],int low,int mid,int high)
{
int lsum = -99999;
int rsum = -99999;
int sum = 0;
int i;
int *res;
res = (int *)malloc(sizeof(int)*3);
for(i = mid;i >= low ;i--)
{
sum += A[i];
if (sum > lsum)
{
lsum = sum;
res[0] = i;
}
}
sum = 0;
for(i = mid+1;i<=high;i++)
{
sum += A[i];
if(sum > rsum)
{
rsum = sum;
res[1] = i;
}
}
res[2] = (lsum+rsum);
return res;
}
int *FindMaximumSubarray(int A[],int low,int high)
{
int *res;
int mid;
int *resL,*resR,*resC;
res = (int *)malloc(sizeof(int)*3);
resL = (int *)malloc(sizeof(int)*3);
resR = (int *)malloc(sizeof(int)*3);
resC = (int *)malloc(sizeof(int)*3);
if(high == low)
{
res[0] = low;
res[1] = high;
res[2] = A[low];
return res;
}
else
{
mid = (int)((low+high)/2);
resL = FindMaximumSubarray(A,low,mid);
resR = FindMaximumSubarray(A,mid+1,high);
resC = FindMaxCrossSubarray(A,low,mid,high);
if(resL[2] >= resR[2] && resL[2] >= resC[2])
return resL;
else if(resR[2] >= resL[2] && resR[2] >= resC[2])
return resR;
else
return resC;
}
}
int main()
{
int i;
int *result;
int A[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
result = FindMaximumSubarray(A,0,15);
for(i=0;i<3;i++)
{
printf("%d ",result[i]);
}
printf("
");
return 0;
}