【问题描述】给定一个整数数组 arraynums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素), 返回其最大和以及与之对应的子数组
【输入形式】一个长度不大于10的整型数组【输出形式】
【样例输入】-2,1,-3,4,-1,2,1,-5,4
【样例输出】6,[4,-1,2,1]
根据要求给出C语言程序代码
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
技术专家团-小桥流水 2023-11-24 06:57关注代码中有详细的注释。运行结果:

代码:
#include <stdio.h> int main() { int s =0,i=0,j,a[10],maxSum = 0,n=0; int len = 0,maxLen = 1,startIndex = -1,endIndex = 0; int index = 0; char ch; int flag = 0; //用来标记是否有正数,如果全是负数,那么单个元素中的最大值就是要求的 while(1) { scanf("%d",&a[n]); //n表示数字个数 if(n == 0 || (n>0 && a[n]>maxSum)) maxSum=a[n]; //找出单个数字中的最大值 if(a[n]>=0) { if(startIndex == -1) startIndex = n; //第一个非负数的下标 endIndex = n;//最后一个非负数下标 flag++; //表示有非负数 } n++; ch = getchar(); if(ch == '\n') break; //遇到回车符结束 } if(flag <= 1) //说明有1个非负数,或者没有非负数,那么单个数字子串中,值最大的就是要求的 { printf("%d,[%d]\n",maxSum,maxSum); return 0; } //遍历,找最大值子串,如果数组中有非负数,那么,和最大的子串,一定是以非负数开始,非负数结束 for(i=startIndex;i<=endIndex;i++) //遍历所有,从第一个非负数开始判断 { if(a[i]<0) continue; s = a[i]; len = 1; //从a[i]往后 for(j=i+1;j<=endIndex;j++) { s += a[j]; len++; if(s > maxSum) { maxSum = s; maxLen = len; index = i; } } } //输出 if(maxLen == 1) printf("%d,[%d]",maxSum,maxSum); else { printf("%d,[",maxSum); for(i=0;i<maxLen;i++) { if(i==0) printf("%d",a[index+i]); else printf(",%d",a[index+i]); } printf("]\n"); } return 0; }解决 无用评论 打赏 举报 编辑记录