一道C语言题 求 一个数组中 连续数字的最大和

题目要求是 在一个文件p33data 中 有N个数字
这个文件从argv[1] 中被读取 N被argv[2]读取
需要输出这一个数组中 连续数字的最大和
列如 -3 100 -4 -2 9 -63 -200 55 输出就是103(就是连续数字 100 -4 -2 9 的和)

如果最大和为负数 则输出 0 最大和可以是整个数组的和
列如 1 4 3 -4 8 输出就是 12

题目描述:有31,-41,59,26,-53,58,97,-93,-23,84十个数。SUM(N,M)表示从第N个数到到第M个数的和。例如:SUM(2,3)=-41+59=18。问:最大的和是多少?对应的N和M是多少?

算法思想:数组中的数字可以看做用负数分割开的一段一段正数,先找出这几段正数中和最大的那段(这题的结果的那串数字必定包括和最大的那串正数)然后慢慢的向两边扩散。文字功底不是很好
不太会描述 大家看程序注释吧

#include <stdio.h>
#define MAXN10
int main(void)
{
int a[10] = {31, -41, 59, 26, -53, 58, 97, -93, -23, 84};
int positive[MAXN];
int i, j, k;
int flag;
int max, temp;
int left, right;
i = j = 0;
while (a[i] < 0)//该循环从左侧开始找第一个非负数 i记录其下标
++i;
max = 0;
temp = 0;
//该循环找到整个数组中和最大的连续正数
//并用left和right分别记录该段连续正数最左边和最右边两个正数的下标
for (k=0; i<10; ++i) {
if (a[i] >= 0) {
j = i;
while (a[i] >= 0 && i < 10)
temp += a[i++];
if (temp > max) {
left = j;
right = i-1;
max = temp;
}
positive[k++] = temp;
temp = 0;
}
}
flag = 0;
temp = 0;
for (i=left-1; i>=0; --i) {
if (a[i]<0 && !flag) { //向左边扩散 先把连续的n个负数加起来
temp += a[i];
} else {//碰到了第一个正数
flag = 1;
if (a[i]>=0 && flag) {//把碰到的连续几个正数加起来
temp += a[i];
} else if (a[i]<0 && flag) {//又碰到了一个负数
if (temp >= 0) {//收益为正数 可以加上
left = i+1;
max += temp;
temp = 0;
++i;
flag = 0;
continue;
} else {//收益为负数 结束循环
break;
}
}
}
}
//printf("%d %d %d\n", left, right, max);
flag = 0;
temp = 0;
for (j=right+1; j<10; ++j) {
if (a[j]<0 && !flag) {
temp += a[j];
} else {
flag = 1;
if (a[j]>=0 && flag) {
temp += a[j];
} else if (a[j]<0 && flag) {
if (temp >= 0) {
right = j-1;
max += temp;
temp = 0;
--j;
flag = 0;
continue;
} else {
break;
}
}
}
}
printf("N = %d M = %d SUM = %d\n", left, right, max);
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-12-12
这么简单的题,网上搜索以下一堆讲解。

一道C语言题 求 一个数组中 连续数字的最大和
i = j = 0;while (a[i] < 0)\/\/该循环从左侧开始找第一个非负数 i记录其下标 ++i;max = 0;temp = 0;\/\/该循环找到整个数组中和最大的连续正数 \/\/并用left和right分别记录该段连续正数最左边和最右边两个正数的下标 for (k=0; i<10; ++i) { if (a[i] >= 0) { j = i;...

c语言中,从一组数中找最大值和最小值
include <stdio.h> \/\/ 获取数组元素的最大值和最小值 int main(void){ (此处空一行)int arr[] = {1,2,3,5,67,8,9,33};int min,max;compute_m(arr,sizeof(arr)\/sizeof(int),&min,&max);(此处空一行)printf("result: min = %d , max = %d \\n",min,max);return 0;} ...

C语言,求数组中的最大值和次大值
int str[10]={1,2,3,4,5,6,7,8,9,10};int i=sizeof(str);int max0=0;\/\/最大值 int max1=0;\/\/次大值 for(i=0;i<10;i++){ if(str[i]>max0)max0=str[i];else if(str[i]>max1)max1=str[i];} system("pause");return 0;} ...

c语言 求一个整型数组所有子数组中和值最大的
include<stdio.h> int MaxSum3(int * A,int n){\/\/优化方案 时间O(n) 空间 O(1)int nStart=A[n-1];int nAll=A[n-1];for(int i=n-2;i>=0;i--){ if(nStart<0)nStart=0;nStart+=A[i];if(nStart>nAll)nAll=nStart;} return nAll;} int main(){ for(int i=0;i<N;...

C语言编程,多种方法求一个数组里的最大值和最小值。
for ( i=0;i<N;i++ ) scanf("%d",&a[i]);m=n=a[0]; for ( i=1;i<N;i++ ) if ( ma[i] ) n=a[i];printf("最大值%d,最小值%d\\n",m,n);} include<stdio.h> \/\/排序法 define N 10 void main() { int a[N],i,j,k;for ( i=0;i<N;i++ ) scanf("...

c语言中怎么求数组中的最大值?
传统的流程图如下:流程的解释:对abc三个数进行大小的比较,总共需要比较三次;1、首先输入a,b,c三个数。2、比较a,b两个数,得出a与b中的最大值。3、然后比较b与c两个数,得出b与c的最大值。4、最后将第2步与第3步得出的最大值进行比较,得出我们需要的最大数。

c语言数组程序, 输入30个数并放在一个数组中,输出其中的最大者和最
} max=min=num[0]; for(i=1;i<n;i++) { if(max<num[i]) max=num[i]; else if(min>num[i]) min=num[i]; } printf("最大为:%f\\n最小为:%f\\n和为:%f\\n平均数为:%f\\n",max,

用C语言编程求出数组中数字的最大值。
maxxr=a[0];for(i=0;i<n;i++){ if(maxxr<a[i]){ maxxr=a[i];} } for(i=0;i<n;i++){ if(maxxr==a[i]){ j=i;break;} } k=j;} int main(void){ int a[10]={ 876,675,896,101,301,401,980,431,451,777},k;fun(a, 10, &k);printf("%d,%d", k, a[...

c语言编写一个函数,找出一维数组中的最大值和最小值,并计算出数组元素的...
n为数组元素个数,max指向最大数,min指向最小数,函数返回值为平均值*\/ int main(){ double b[10],aver;int x,y=10,max=0,*ma=&max,min=0,*mi=&min;for(x=0;x<y;x++){b[x]=x*(x-8.25)*0.1;printf("数%d=%f\\n",x,b[x]);} aver=fun(b,y,ma,mi);printf("最大...

c语言编程题。 编程求数组a[10]的最大、最小和平均值。(要求用循环语句...
printf("请输入10个数:\\n");for(i=0;i<10;i++){ scanf("%lf",&a[i]);total=total+a[i];if(a[i]>max){ max=a[i]} if(a[i]<min){ min=a[i];} } average=total\/10;printf("最大数:%lf\\n",max);printf("最小数:%lf\\n",min);printf("平均值:%lf\\n",average...

相似回答