• 环数组的最大子数组


    #include<stdio.h>
    #define N 1000
    #define INF 10000
    int MaxSubSum(int * arr,int n ,int Size)
    {
        int maxSum = -INF;
        int sum = 0;
        int i=0;
        for(  i = n; i < n+Size; i++)
        {
            if(sum < 0)
            {
                sum = arr[i];
            }
            else
            {
                sum += arr[i];
            }
            if(sum > maxSum)
            {
                maxSum = sum;
            }
        }
        return maxSum;
    }
    int seekmax(int*arr,int Size)
    {
        int m=arr[0];
        int i=0;
        for(  i = 0; i < Size; i++)
        {
            if(m<arr[i])
            {
               m=arr[i];
            }
        }
        return m;
    }
    
    
    
    int main()
    {
        int BreakRing(int *arr,int Size);
        int MSS;
        int i;
        int j=0;
        int n=0;
        int arr[N]={0};
        char c;//用来判断何时停止输入的
        printf("input N number:
    ");
        for(i=0;i<N;i++)
        {
            scanf("%d",&arr[i]);
             scanf("%c",&c);
            j++;//计数器
            if(c=='
    ')//打入回车则自动结束
            {
              break;
            }
        }
        printf("环数组:
    ");
    
        for(i=0;i<j;i++)//原数组打出屏幕
        {
            printf("%d  ",arr[i]);
        }
    
        printf("
    ");
    
        MSS=BreakRing(arr,j);
        printf("结果:
    ");
    
        printf("Mss=%d
    ",MSS);
        return 0;
    
    }
    int BreakRing(int *arr,int Size)
    {
        int b[N]={0};
        int i;
        int j=0;
        int Max;
        int k=0;
        int Max1[N]={0};
        for(i=0;i<Size;i++)
        {
            b[i]=arr[i];
        }
         for(i=Size;i<2*Size-1;i++)
        {
            b[i]=arr[j++];
        }
        printf("打开:
    ");
    
        for(i=0;i<2*Size-1;i++)//数组打出屏幕
        {
            printf("%d  ",b[i]);
        }
        printf("
    ");
        for(k=0;k<Size;k++)
        {
            Max1[k]=MaxSubSum(b,k,Size);
    
        }
         Max=seekmax(Max1,Size);
        return Max;
    }

    运行截图:

    解决思路:

    老师课堂上已经讲过了一点思路,即把环数组拆开成一维数组。但为了保证可以从最后一个开始,经第一个进行循环,要对数组进行变形,将一个周期填充满,这样就保证了循环(如图所示)。

     然后我构造了数组b,将展开的数组存入。

    然后以size为步长,反复调用先前构造的MaxSubSum函数,得到一个序列,其中最大值即为所求。

     

  • 相关阅读:
    水晶报表设计--基本概念
    微信公众平台开发小结
    CCF计算机职业认证考试
    Linux 命令
    百度搜索引擎的一些技巧
    Windows的一些操作命令
    Eclipse:写jsp 出现的一些问题
    操作系统(基本问题)
    C语言编程技巧(注意点)
    mysql命令报错问题
  • 原文地址:https://www.cnblogs.com/1742031541lh/p/9904613.html
Copyright © 2020-2023  润新知