• 返回一个整数数组中最大子数组的和2


    一、题目及要求:

          题目:返回一个整数数组中最大子数组的和

          要求(新加):①如果数组A[0]...A[j-1]首尾相邻,允许A[i-1]...A[n-1],A[0]...A[j-1]之和最大;②同时返回最大子数组的位置。

    二、设计思路:

    这次程序代码在此基础上增加了首位相连形成环链

    1.用户输入环链长度,并输入每个环链数组

    2.根据算法将首位相连形成环链

    3.将子数组之和相加存入SUM

    4.输出SUM与子数组

    #include<iostream>
    using namespace std;
    void main()
    {
        int i;
        int s = 0, sum = 0, head = 0, end = 0, h = 0, e = 0, x = 0;
        cout << "请输入数组长度:";
        cin >> x;
        int a[100];
        cout << "请输入数组中的数:";
        for (i = 0; i<x; i++)
        {
            cin >> a[i];
        }
    
    
        for (i = 0; i<x; i++)        //子数组相加得到最大值
        {
            s += a[i];
            if (s>0)
            {
                e++;
            }
            else
            {
                s = 0;
                h = i + 1;
                e++;
            }
            if (s>sum)
            {
                sum = s;
                head = h;
                end = e;
            }
        }
        if (s > 0)            //环链首位相加时的情况
        {
            head = h;
            i = 0;
            e = e - x;
            while (s > 0 && e != h - 1)
            {
                s += a[i];
                i++;
                e++;
                if (s > sum)
                {
                    sum = s;
                    end = e;
                }
    
            }
    
           if (end > head)
                  {
                        sum = sum / 2;
                  }
                  cout << "最大子数组的和为:" << sum << endl;
                  cout << "最大子数组为:";
         if (end > head)                //输出子数组
            {
                for (i = head; i < end; i++)
                {
                    cout << a[i];
                    cout << "   ";
                }
            }
            else
            {
                for (i = head; i < x; i++)
                {
                    cout << a[i];
                    cout << "   ";
                }
                for (i = 0; i < end; i++)
                {
                    cout << a[i];
                    cout << "   ";
                }
            }
        }
        system("pause");
    }

    四、测试及运行结果:

    测试数据:

    1 -2 -3 8 1(有正数、负数)

    1 2 3 4 5 (只有正数)

    运行结果:

    五、心得体会:

      题目新加的要求是首尾相连,我们可以通过重复设置数组增加另一相同数组可以使程序相当于首尾相连

     

    结对开发伙伴:朱建颖  http://www.cnblogs.com/zjy666

  • 相关阅读:
    ATM
    Python不同目录间模块调用
    Python跨目录调程序
    Python软件目录结构规范
    进程的创建-multiprocessing
    进程
    多任务版udp聊天器
    死锁
    互斥锁
    同步
  • 原文地址:https://www.cnblogs.com/wooder/p/5326425.html
Copyright © 2020-2023  润新知