题目:
实现一个函数get_submax(),对 N 个元素的整型数组,求该数组的各个子数组中,子数组之和的最大值是多少,子数组的起始元素地址,以及子数组长度?这三个结果都通过参数返回。如果有相同最大值的子数组,返回先找到的子数组。例如数组a[7] = {-2, 5, 3, -6, 4, -8, 6};则子数组之和的最大值是8 (即a[1] + a[2])。
代码:
#include<stdio.h>
void max(int *arr1,int *lang1,int **init,int **uninitnt, int *max2);
int main(void)
{
int arr []={-2,5,3,-6,4,-8,6},lang1,*init,*uninit,max1=0;
lang1=sizeof(arr)/sizeof(int);
max(arr,&lang1,&init,&uninit,&max1);
printf("起地址:%#x,始地址:%#x,长度:%d,max:%d\n",init,uninit,lang1,max1);
return 0;
}
/*
* function: 传入N 个元素的整型数组,求该数组的各个子数组中,子数组之和的* 最大值,子数组的起始元素地址,以及子数组长度。
* paremeter1:arr1,传入的数组,范围int
* paremeter2:lang1,传入的数组长度,范围:输入数组具体长度
* paremeter3:innit,要传回子数组的起元素地址
* paremeter4:uninit,要传回子数组的末元素地址
* paremeter5:max2,求该数组的各个子数组中,子数组之和的最大值
* return:无
*/
void max(int *arr1,int *lang1,int **init,int **uninit,int *max2)
{
int lang2=*lang1,sum=0,i,j,z,x;
for(i=1;i<=lang2;i++)//子数组长度
{
for(j=0;j<lang2;j++)//各个子数组遍历
{
if((j+i)>lang2)
break;
for(z=j,x=j+i;z<x;z++)//单个子数组遍历的总值
sum+=arr1[z];
if(sum>*max2)//挑出最大值子数组
{
*lang1=i;
*init=&arr1[j];
*uninit=&arr1[j+i];
*max2=sum;
}
sum=0;
}
}
}