您的位置:首页 > 其它

第二次课上带电脑喽-----求整数数组子数组的最大和

2014-03-10 19:06 141 查看
队友:迟真真

这次软件工程课堂上,建民老师又让我们结对编程(其实,还挺好玩的,虽然自己编程不怎滴,不过这种教学方法真的很好呢!),进入主题......

题目如下:求一个整型数组的最大子数组的和

一拿到题目,真真和我就开始吧嗒吧嗒地讨论,好像没有头绪,你一言我一语思路就来了:

思路1:

定义一个max,定义一个整数元素数组。先求出相邻元素为一个元素时的最大值赋给max;

再相邻元素为2个元素时的最大值赋给max;

相邻元素为3个元素时的最大值赋给max;

相邻元素为4个元素时的最大值赋给max;

。。。

课上并没有调试出结果,课下调试正确。

代码:

#include<stdio.h>
#define M 100
void main()
{
int a[M];
int i,j,N;
int m=0,max=0;
int n;
printf("输入数组个数  ");
scanf("%d",&n);
N=n-1;
printf("输入数组元素  ");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)    //比较一个元素时的最大值
{
if(a[i]>max)
{
max=a[i];
}
}

while(N>0)     //比较相邻2,3。。n个相邻元素时的最大值
{
for(i=0;i<N;i++)
{
m=0;
for(j=0;j<=(n-N);j++)  //计算相邻的(n-N+1)的和,赋给m
{
m=m+a[i+j];
}
if(m>max)
{
max=m;
}
}
N--;
}
printf("最大为:%d\n",max);

}


还有一种算法,思路大致相同:

思路2:

a[0]

a[0]+a[1]

a[0]+a[1]+a[2]

……

a[0]+a[1]+a[2]+……a[n-1]

a[1]

a[1]+a[2]

a[1]+a[2]+a[3]

………

a[1]+ a[2]+a[3]+……..a[n-1]

a[2]

a[2]+a[3]

a[2]+a[3]+a[4]

………..

a[2]+a[3]+a[4]+……a[n-1]

………..

以此类推:

a[i]

a[i]+a[i+1]

…….

a[i]+a[i+1]………a[n-i]

因此可以找到规律,然后用3个for循环语句。

但是考虑到时间空间复杂度,这种方法貌似不太好

可以先比较出和的最大值,把这些和的最大值放在一个数组中,然后再求这个数组的最大值。

下面还有一种类似的算法,她是先把单个元素的子数组单另出来求得:

代码:

#include<stdio.h>
void main()
{
int a[100];
int i,j,n;
int k;
int m=0,max;
printf("请输入数组元素的个数:");
scanf("%d",&n);
printf("请输入数组元素:");
for(i=0;i<n;i++)
scanf("%d",&a[i]);

max=a[0];
for(i=0;i<n;i++)
{

for(j=i;j<n;j++)
{
m=0;
for(k=i;k<=j;k++)
{
m=m+a[k];
}
if(m>max)
{
max=m;
}
}
}
printf("最大子数组的和为:%d\n",max);

}


结对编程,很能锻炼合作能力,交流能力,培养和队友的默契。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐