连续子数组的最大和-使用getchar()进行代码改进

来源:互联网 发布:c语言编程训练题 编辑:程序博客网 时间:2024/06/07 06:40

题目描述

输入一个整型数组,数组里有正数也有负数,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

输入描述

输入第一行为整数序列,数字用空格分隔,如:1 -2 3 10 -4 7 2 -5

输出描述

上述最大子数组为{3,1,-4,7,2},因此输出为18


分析

方法1:枚举所有子数组并求和。  先从第一个数字开始找到最大的子数组的和,再从第二个数开始找到子数组的和,并找到最大的数,第二个数开始的最大数和第一个开始的最大数比,保留其中较大的,然后从第三个数开始找到最大的子数组的和,重复上述过程,直到找到最大的连续子数组的最大和。

备注:该方法效率会比较低 


方法2:采用一个for循环,定义局部变量sum和全局变量max,如果子数组加上后一个数后大于等于后一个数时,那么sum变为sum加上后一个数,否则sum变为后一个数。然后判断sum是否大于max,如果大于max,那么用sum覆盖max,否则max保持不变。


代码方法1

#include<stdio.h>
#define MAX 1024
int main()
{
int i,j,k,max,sum;
int n=0;
int x[MAX]={0};
while(1)
{
scanf("%d",&x[n]);
if(getchar()=='\n')
{
break;
}
n++;
}
//由于break的原因,所以输出的n会比输入数组的个数少1  
//备注:该方法效率会比较低 
for(i=0;i<n+1;i++)
{
sum=0; 
//(在遍历到第二个数字时,注意sum=0的作用,就是将sum初始化,重新从0开始求和)
for(j=i;j<n+1;j++)
{
sum+=x[j];//求和
if(max<sum) max=sum;
}
}
printf("最大和=%d\n",max);
return 0;
 } 


代码方法2

#include<stdio.h>
#define MAX 1024
int main()
{
int i,j,max,sum;
int n=0;
int a[MAX]={0};
while(1)
{
scanf("%d",&a[n]);
if(getchar()=='\n')
{
break;
}
n++;
}
for(i=0;i<n+1;i++)
{
if(sum+a[i]>=a[i])
sum+=a[i];
else
sum=a[i];
if(sum>max)
max=sum;
}
printf("%d",max);
return 0;
 } 







原创粉丝点击