m0_72280754 2023-11-24 04:26 采纳率: 90.2%
浏览 3

根据要求给出C语言程序代码

【问题描述】给定一个整数数组 arraynums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素), 返回其最大和以及与之对应的子数组
【输入形式】一个长度不大于10的整型数组【输出形式】
【样例输入】-2,1,-3,4,-1,2,1,-5,4
【样例输出】6,[4,-1,2,1]

  • 写回答

2条回答 默认 最新

  • 关注

    代码中有详细的注释。运行结果:

    img

    代码:

    #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;
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 请采纳用户回复 12月15日
  • 创建了问题 11月24日