最小子段和
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
int i,j,k,t,n,s,smin,q[1000],a[1000];
t=time(0)%1000;
srand(t);
printf("请确定序列中的正负项个数n:");
scanf("%d",&n);
printf("序列中%d个整数为:",n);
for(i=1;i<=n;i++)
{
t=rand()%(4*n)+10;
if(t%2==1)
a[i]=-1*(t-1)/2;
else
a[i]=t/2;
printf("%d ",a[i]);
}
smin=0;
q[0]=0;
for(j=1;j<=n;j++)
{
if(q[j-1]>=0)
q[j]=a[j];
else
q[j]=q[j-1]+a[j];
if(q[j]<smin)
{
smin=q[j];
k=j;
}
}
printf("\n最小子段和为:%ld\n",smin);
for(s=0,i=k;i>=1;i--)
{
s+=a[i];
if(s==smin)
break;
}
printf("最小子段从序列的第%d项到第%d项。\n",i,k);
}