循环数组的子数组最大和
一。实验要求
1.输入一个整型数组,数组里有正数也有负数,数组中一个或多个整数组成一个整数组,每个子数组都有一个和。
2.数组可以首位相连,允许A【i-1】,....,A[n-2],A[0]........A[j-1]和最大
3.返回最大子数组的位置,求最大子数组的和.
二、实验思路
循环数组,也就是最后一个数组值和第一个数组值相连,整个子数组可以从任何一个整数开始遍历求出所有的子数组,参考前面数组的设计思想,有二种可能的解决方案。
1.对数组内的每一个数都进行遍历,然后遍历以他们为起点,长度最大为数组长度的所有子数组,比较各个子数组的大小,求出最大子数组的和。
2.从头开始遍历,遍历到数组A【i】时,最大子数组的值可能是max+A【i】,也可能为A【i】,做出比较,取最大值.
我们选择了第一种解决方案,遍历所有的子数组求出最大值,因为是循环数组,所以从每一个数开始遍历其最长子数组的长度都是数组的长度,所以我们将数组通过if循环,赋值给长度为数组长度2n-1的新数组,设施遍历长度为n,遍历出所有子数组,求出最大值.
三。实验人员:
王铭乾
int
main()
{
int
i,d,m,a,h,l,p;
int
max=0;
int
b=0;
int
c [10];
int
n [19];
srand(time(NULL));
for
(i=0;i<10;i++)
{
d=rand()%2;
if
(d==0)
{
c[i]=rand()%10;
}
else
{
c[i]=-rand()%10;
}
printf(
"%d "
,c[i]);
}
printf(
"\n "
);
for
(m=0;m<19;m++)
{
if
(m<10)
{
n [m]=c [m];
}
else
{
n [m]=c [m-10];
}
printf(
"%d "
,n[m]);
}
for
(m=0;m<10;m++)
{
for
(i=m;i<(10+m);i++)
{
for
(a=i;a<(10+i);a++)
{
d=0;
for
(h=i;h<=a;h++)
{
d+=n[h];
if
(d>max)
{
max=d;
l=i;
p=a;
}
}
}
}
}
if
(max==0)
{
max=c[0];
for
(i=0;i<10;i++)
{
if
(max<c[i])
{
max=c[i];
l=p=i;
}
}
}
if
(max>2147483647)
printf(
"piease atart again\n"
);
printf(
"\n"
);
printf(
"maximum array is=%d\n"
,max);
printf(
"最大子数组为\n"
);
for
(i=l;i<=p;i++)
{
printf(
" %d "
,n[i]);
}
return
0;![](https://common.cnblogs.com/images/loading.gif)
四。实验源代码