zoukankan      html  css  js  c++  java
  • 数组练习2

     结对开发:张哲  张晓菲

    题目:返回一个数组中子数组最大和,数组可以首尾相连。

    一、实验思路

       本次实验在第一次的基础上增加了一些难度,数组可以首尾相连组成一个环,我们两个经过思考和讨论后得到一个方法:

    1、在对环的特殊性研究后,我们可以将一个环拆成一个链,即:5 -1 3 3 拆成5 -1 3 3 5 -1 3 这个环每次从开始位置四个四个组队,即5 -1 3 3 、-1 3 3 5、3 3 5 -1、3 5 -1 3 ,然后利用for循环,计算其最大子数组和,这样即可以达到一个环所呈现的结果。

    2、对于记录位置这个问题,我们定义了cstart start end三个变量来表示,cstart记录每次循环最大子数组和的位置,start记录最终最大子数组和的位置,end则记录最大子数组和终点的位置。

    二、程序代码

     1 //返回一个整数数组中最大子数组的和
     2 //有正数、有负数、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和、将数组首尾相连、返回最大子数组的位置
     3 //张哲、张晓菲 2016/3/22
     4 
     5 #include<iostream>
     6 using namespace std;
     7 
     8 #define N 10000
     9 int main()
    10 {
    11     int num, arr[N];
    12     int sum = 0;
    13     cout << "请输入数组元素个数:";
    14     cin >> num;
    15     cout << "请输入数组元素的值:";
    16     for (int i = 0; i<num; i++)//输入环状数组的元素值
    17     {
    18         cin >> arr[i];
    19     }
    20     for (int i = num; i<(2 * num - 1); i++)//将环抻直,例如环状数组值原先为[A,B,C,D],那么抻直之后为[A,B,C,D,A,B,C]
    21     {
    22         arr[i] = arr[i%num];
    23     }
    24     cout << "环抻直之后的数组相当于:" << endl;
    25     for (int i = 0; i<(2 * num - 1); i++)
    26     {
    27         cout << arr[i] << " ";
    28     }
    29     cout << endl;
    30 
    31     int max = arr[0];
    32     int end, start, cstart;//end为结束位置 start为起始位置
    33 
    34     //求子数组最大和
    35     for (int j = 0; j<num; j++)
    36     {
    37         sum = 0;
    38         for (int i = j; i<j + num; i++)
    39         {
    40             if (sum <= 0)
    41             {
    42                 sum = arr[i];
    43                 cstart = i;//当前最大子数组的起始位置
    44             }
    45             else
    46                 sum = sum + arr[i];
    47             if (sum>max)
    48             {
    49                 max = sum;
    50                 start = cstart;
    51                 end = i;//最大子数组的终止位置
    52             }
    53         }
    54     }
    55     cout << "子数组和的最大值为:" << max << endl;
    56     cout << "最大子数组的起始位置为环抻直后的第" << start + 1 << "个元素,结束位置为环抻直后的第" << end+1 << "个元素。" << endl;
    57     return 0;
    58 }

    三、实验结果截图

    结果中给出了拆开后的数组,数组的位置从1开始,数组位置记录的是拆开后的位置。

    四、时间记录日志

    日期 开始时间 结束时间 中断时间(min) 净时间(min) 活动 备注

    3月21号

    星期一

    14:00 15:50 10(课间) 100 听课 软件工程
      20:00  22:00  120 编程 一维数组1

    3月22号

    星期二

    19:50 20:40 0 50 编程 一维数组1

    3月23号

    星期三

    15:00 14:00 10(休息) 50 看书 构建之法
      20:00 21:15 0(休息) 75 编程 一维数组1

    3月24号

    星期四

    14:00 15:50 10(课间) 100 听课 软件工程
      20:30 22:00 10(休息) 80 编程 一维数组2

    3月25号

    星期五

    16:30 17:00 0(休息) 70 编程 一维数组2
      21:00 22:00 0 60 编程 一维数组2

    3月26号

    星期六

    9:00 10:00 0 80 编程

    一维数组2程序进行

    修改、写博客

  • 相关阅读:
    5个步骤迅速脱离低薪族
    phpdebugapd调试器
    重置zend studio 默认设置的方法
    CMD用什么命令可以删除服务?
    PHP自动识别字符集并完成转码
    一只赖蛤蟆写给白天鹅的情书
    遇到的问题
    Sql 注入漏洞
    分页技术
    flex学习记录——加载图片
  • 原文地址:https://www.cnblogs.com/zz0906/p/5322030.html
Copyright © 2011-2022 走看看