上机作业
输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
例如输入的数组为3, 2, -6, 4, 7, -3, 5, -2,和最大的子数组为4, 7, -3, 5。
先定义两个数组n[12],b[],一个用来放数组,一个用来放子数组。
其中三层嵌套循环
第一层,用来规定几个数相加;第二层用来,n[0]-n[11]那个作为第一个数开始加;第三层用来完成加法。
代码
#include<stdio.h>
int main()
{
int n[8] = { 3,2,-6,4,7,-3,5,-2 }, b[8] = {0};
int i, j,max=n[0],m=0,k,a;
for (k = 0; k < 8; k++)
{
for (i = k; i < 8; i++)
{
for (j = i; j <= i; j++)
{
m += n[j];
}
if (m > max)
{
max = m;
for (a = 0; a < 8; a++)
{
b[a] = 0;
}
for (j = k; j <= i; j++)
b[j] = n[j];
}
}
m = 0;
}
for (j = 0; j < 8; j++)
{
if (b[j]) printf("%d ", b[j]);
}
return 0;
}
这个相对于上面来说,简单了一点:
int a[] = { 3, 2, -6, 4, 7, -3, 5, -2 };
int left = 0, right = 0, Max = 0, max = 0, temp = 0, ml = 0, mr = 0;
for (int i = 0; i < 8; i++)
{
left = i;
right = i;
temp = a[i];
max = temp;
for (int j = i + 1; j < 8; j++)
{
if (max < temp + a[j])
{
temp += a[j];
right = j;
max = temp;
}
else
temp += a[j];
}
if (max > Max)
{
Max = max;
ml = left;
mr = right;
}
}
算出来,Max就是最大值,ml是最大子数组的左端,mr是最大子数组的右端。
大佬帮我优化了
#include<stdio.h>
int main()
{
int a[8] = { 3,2,-6,4,7,-3,5,-2 };
int max = a[0], sum = a[0], l = 0,r = 0, ll = 0,i = 0;
for(i=1;i<=7;i++)
{
if(sum+a[i]<0)
{
ll=i+1;sum=0;
}
else
{
if(sum+a[i]>max)
l=ll;
r=i;
max=sum+a[i];
}
}
for (i = l; i <= r; i++)
{
printf("%d ", a[i]);
}
return 0;
}
初学,见谅