挑战作业
给定一个整数数组(包含正负数),找到一个具有最大和的子数组,返回其最大的子数组的和。
具体要求参看邹欣老师博客 现代程序设计作业2
1.实验代码:
#include<stdio.h>
#include<stdlib.h>
int main ()
{
FILE *fp; //定义文件指针
int n,i;
int nums[1000];
int sum = 0; //初始和为0
int max = nums[i];//最大值最初必为数组第一个元素
if((fp=fopen("F:\挑战作业f505-Yangling.txt","w+"))==NULL) //建立新文本文件进行读或写
{
printf("File open error!
");
exit(0);
}
scanf("%d
",&n); //输入一维数组中元素的个数
fprintf(fp,"%d
",n);
for(i=0;i<n;i++)
scanf("%d",&nums[i]);
fprintf(fp,"%d",nums[i]);
for(i=0;i<n;i++)
{
sum = sum + nums[i]; //遍历一个元素,累加一次
if(sum < nums[i])//如果加上当前元素之后的和比当前元素还小,则舍弃之前的元素,从当前元素开始累加
{
sum = nums[i];
}
//如果加上当前元素之后的和比当前元素大
//说明可以继续累加
//如果当前和比最大值大,则更新最大值为当前和
//否则,不做更新
if(sum > max)
{
max = sum;
}
}
fprintf (fp,"
%d",max);
if(fclose(fp))
{
printf("Can not close the file!
");
exit(0);
}
return 0;
}
2.设计思路:
遍历一个元素,累加一次 ,如果加上当前元素之后的和比当前元素还小,则舍弃之前的元素,从当前元素开始累加
如果加上当前元素之后的和比当前元素大,说明可以继续累加,如果当前和比最大值大,则更新最大值为当前和
否则,不做更新 最后输出max
3.本题遇到的问题及解决办法:
我开始是照着老师的思路去想的,后来发现太难了,还要用二维数组在
垂直水平方向上来相连 并且要考虑最佳解法,所以我就只写了一维数组的
方法