zoukankan      html  css  js  c++  java
  • 数组02

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

    二、要求:输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

      如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。

      同时返回最大子数组的位置。 求所有子数组的和的最大值。

    三、设计思想

      在上一次实验的基础上,利用动态数组,为满足首尾相连,在计算一次之后,要把该数放在数组的最后边,这样循环遍历,最后求得最大数组之和及数组数值所在的位置。在定义数组array时,使用了指针的动态空间申请,以此来储存数组中的元素,并在最后释放了申请的空间,避免资源浪费。

    四、源代码 

     1 //数组02
     2 //胡浩特、朱子嘉 2016/3/27
     3 
     4 #include <iostream>
     5 using namespace std;
     6 
     7 void Arr_Maxsum(int arr[], int length, int first, int last)
     8 {
     9     int count = 0;
    10     int result = arr[0];
    11     int sum = arr[0];//初始化
    12     for (int i = 0; i<length; i++)
    13     {
    14         sum = 0;
    15         for (int j = i; j<length + i; j++)
    16         {
    17             sum += arr[j];
    18             if (sum>result)
    19             {
    20                 result = sum;
    21                 first = i;
    22                 last = j;
    23             }
    24         }
    25         arr[length + i] = arr[i];
    26     }
    27     if (last >= length)
    28     {
    29         cout << "最大子数组起始位置为:" << first + 1 << endl;
    30         cout << "最大子数组终止位置为:" << last - length + 1 << endl;
    31     }
    32     else
    33     {
    34         cout << "最大子数组起始位置为:" << first + 1 << endl;
    35         cout << "最大子数组终止位置为:" << last + 1 << endl;
    36     }
    37     cout << "最大子数组为:" << endl;
    38     for (int m = first; m <= last; m++)
    39     {
    40         cout << arr[m] << "  ";
    41     }
    42     cout << endl;
    43     cout << "最大子数组的和为:" << endl;
    44     cout << result << endl;
    45 }
    46 int main()
    47 {
    48     int num, length, first, last;
    49     first = 0;
    50     last = 0;
    51     cout << "请输入数组元素个数:";
    52     cin >> length;//数组长度
    53     num = 2 * length;
    54     int * arr = new int [num];//申请空间
    55     cout << "请输入数组数据:" << endl;
    56     for (int i = 0; i<length; i++)
    57     {
    58         cin >> arr[i];
    59     }
    60     cout << endl;
    61     Arr_Maxsum(arr, length, first, last);
    62     delete [] arr;//释放空间
    63     return 0;
    64 }

    五、实验结果

      

    六、实验总结

      本次实验刚开始的时候设计思路还不太明确,想使用链表的方法实现,但是对数据结构中的链表知识掌握不太牢固,不知道如何使用,后来,经过一番讨论与思考决定还是利用上次的动态数组完成实现。在编程过程中的一些细节知识还把握的不好,浪费了一定的时间:思考如何将链式的数组转化成为环式的数组,然后再看成链式的数组,来查找最大子数组,算法修改了很多次后才完成了实验的要求,通过本次实验我们俩都收获了宝贵的经验,也增强了自己对于coding的信心。

  • 相关阅读:
    HTML5中meta属性的使用详解
    前端部分兼容性问题汇总
    position元素定位详述
    jquery简单实现轮播图
    事件委托-选项卡案例
    async、await
    前端会遇到的算法
    arguments实参个数
    前端知识点整理(三)
    var、let、const
  • 原文地址:https://www.cnblogs.com/JYQ-hu/p/5326468.html
Copyright © 2011-2022 走看看