最大连续子数列和
给出一个数列(元素个数不多于100),数列元素均为负整数、0、正整数。请找出数列中的一个连续子数列,使得这个子数列中包含的所有元素之和最大,在和最大的前提下还要求该子数列包含的元素个数最多,并输出这个最大和以及该连续子数列在整个数列中的位置。
例如数列为4 -5 3 2 4时,输出“和为9,子数列起始位置为2,结束位置为4”;再比如数列为1 2 3 -5
0 7 8时,输出“和为16,子数列起始位置为0,结束位置为6”。
键盘输入:为两行,第一行为数列元素个数,第二列依次输入各个元素。
7
1 2 3 -5 0 7 8
屏幕输出:
和为16,子数列起始位置为0,结束位置为6
#include<stdio.h> int seek(int a[100],int n,int *p1,int *p2) { int i1,i2,i3,t1=0,t2=n-1,sum=0,max; for (i1=0;i1<n;i1++) { for (i2=n-1;i2>=i1;i2--) { for (i3=0;i3<=i2;i3++) sum=sum+a[i3]; if (i1==0&&i2==n-1) max=sum; else { if (sum>max) { t1=i1; t2=i2; max=sum; } else if (sum==max) { if (i2-i1>t2-t1) { t1=i1; t2=i2; } } } sum=0; } } *p1=t1; *p2=t2; return (max); } void main() { int a[100],t1,t2,n,i,max; int *p1,*p2; scanf("%d",&n); fflush(stdin); for (i=0;i<n;i++) scanf("%d",&a[i]); p1=&t1; p2=&t2; max=seek(a,n,p1,p2); printf("和为%d,子数列起始位置为%d,结束位置为%d\n",max,t1,t2); }