码迷,mamicode.com
首页 > 编程语言 > 详细

求一个环形数组最大子数组的和

时间:2018-11-04 00:29:37      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:正数   超过   stdio.h   个数   依次   整数   分享   输入   存储   

假如我们输入一个一维的数组,数组中既有正数也有负数,而且这个数组首尾相接,就像一个圆圈。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值,如何用编程的语言实现?
设计思想:
1.首先定义一个数组与这个数组的长度,然后输入这个数组。
2.再定义一个新的数组,此数组把第一个数组的数字存储后再存储一次(用for循环进行数组信息的存储),例子:如第一个数组为4 5 6 ;则第二个数组为4 5 6 4 5 6 。
3.再定义三个 int 类型的变量, nowsum(保存暂时的和)、maxsum(保存和的最大值)还有 x(用于控制开始位置和子数组的最大长度,不能高于第一个数组的长度)。运用for循环进行对nowsum的更新,如果 nowsum>maxsum,则 maxsum 进行更新,反之不更新。例子:如第一个数组为4 5 6 ;则第二个数组为4 5 6 4 5 6 。nowsum 依次为4,4 5,4 5 6,5,5 6,5 6 4,……最终结果为15,子数组为4 5 6。
下面是具体的代码:

#include "stdafx.h"
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
    int i,k=0,count,count2,num1[100],num2[100];
    printf("请输入数字个数,不超过50:");
    scanf("%d",&count);
    count2=count*2;
    printf("请输入数字:");
    for(i=0;i<count;i++)
    {
        scanf("%d",&num1[i]);
    }
    for(i=0;i<count2;i++)
    {
        if(i<count)
        {
            num2[i]=num1[i];
        }
        else
        {
            num2[i]=num1[i-count];
        }
    }
    int x=0,maxsum = 0,nowsum = 0;
    for(i=x;i<count+x;i++)
    {
        nowsum=nowsum+num2[i];         
        if(nowsum>maxsum)
        {
            maxsum=nowsum;
        }   
        else
        {
            maxsum=maxsum+0;
        }         
        if(i==count-1+x)        
        {             
            x++;            
            if(x<count)                
        {                    
            i=x-1;                     
            nowsum=0;
        }                 
        else
        {
            break;         
        }     

        }

    }
    printf("最大子数组的和:%d\n",maxsum);
    return 0;
}

 最后附上我们合作的照片:

技术分享图片

求一个环形数组最大子数组的和

标签:正数   超过   stdio.h   个数   依次   整数   分享   输入   存储   

原文地址:https://www.cnblogs.com/njzy123456/p/9899688.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!