zoukankan      html  css  js  c++  java
  • 求固定数组的最大子数组

    一、设计思路 

      先将一个数组赋初值为从零开始按加一递增的子数组的和,之后将求解分为三层,即三个for循环,最里边一层求子数组的和,将各个个数相同的子数组中最大的赋给另一个数组,第二层决定子数组的位置,第三层决定子数组的个数。最后将得到的子数组进行大小比较,输出。

    二、代码

     1 //刘双渤,2015年3月20日,最大子数组求和
     2 #include <iostream>
     3 using namespace std;
     4 
     5 void main()
     6 {
     7     int a[10],b[10],c[10];
     8     int min,max;
     9     int i,t,k,S,bmax,bmaxi,C;
    10     //输入
    11     cout<<"请输入两个数确定数组中值的取值范围(确保前一个整数小于后一个整数):"<<endl;
    12     cin>>min>>max;
    13 
    14     for(i=0;i<10;i++)
    15         a[i]=min+rand()%(max-min);
    16 
    17     cout<<"此随机大小为10的随机数组为:"<<endl;
    18     for(i=0;i<10;i++)
    19         cout<<a[i]<<" ";
    20 
    21     cout<<endl;
    22 
    23     for(i=0;i<10;i++)                //将b[10]初值均赋为0
    24         b[i]=0;
    25 
    26     t=1;
    27     for(i=0;i<10;i++)                //将b[10]初值按从a[0]开始依次增加的子数组和分别赋值
    28     {
    29         for(k=0;k<t;k++)
    30             b[i]+=a[k];
    31         t++;
    32     }
    33 
    34     S=0;
    35     for(t=0;t<10;t++)               //求出各个数目的子数组中最大值
    36     {
    37         for(i=0;i<10-t;i++)
    38         {    
    39             for(k=0;k<t+1;k++)
    40                 S+=a[i+k];
    41             if(b[t]<=S)
    42             {
    43                 b[t]=S;
    44                 c[t]=i;
    45             }
    46             S=0;
    47         }
    48     }
    49 
    50     bmax=b[0];
    51     for(i=0;i<10;i++)                //求出最大的子数组和其所在位置
    52     {
    53         if(bmax<=b[i])
    54         {
    55             bmax=b[i];
    56             bmaxi=i;
    57         }
    58     }
    59     //输出
    60     cout<<"最大子数组和为:"<<endl;
    61     cout<<bmax<<endl;
    62     cout<<"最大子数组为:"<<endl;
    63     C=c[bmaxi];
    64     for(i=0;i<bmaxi+1;i++)
    65     {
    66         cout<<a[C+i]<<"	";
    67     }
    68     cout<<endl;
    69 }

    三、设计过程
      这个代码实现的过程最大时间复杂度为n3,一开始的思路混乱,之后将求最大的子数组的过程按最寻常的思路进行一步步分解,得到了如上的设计思路。初次调试时,无法输出最大数组和和最大子数组,便进行断点调试,发现第35行开始t的变化的错误。解决t的问题后,调试负数范围,发现不能输出最大子数组,却可以输出最大子数组的和,修改53行后解决。在不断用相同值调试中发现,每次产生的数组内的随机数不相同,但每个数组都相同,原来是缺少时间的限制,这样以前的的几个随机数的程序也就犯了相同的错误,以后避免此错误的发生。

    四、实验结果

     

    五、进度计划

    日期

    计划小时数

    累计小时数

    实际小时数

    累计实际小时数

    PV

    累计PV

    EV

    累计EV

    3/22

    1

    2

    2.3

     

    六、时间记录日志

    学生  **                           日期  2015/3/23

    教师  **                           课程  软件工程

    日期

    开始时间

    结束时间

    中断时间

    净时间

    活动

    备注

    3/23

    4:10

    6:30

    140

    编程

     

    七、缺陷记录日志

    学生 刘**

    日期 2015/3/23

    教员 王**

    程序号 01

    日期

    编号

    类型

    引入阶段

    排除阶段

    修复阶段

    修复缺陷

    3/23

    1

    调试

    编译

    描述:参数“t”值的变化错误

    2

    调试

    编译

    描述:应将“<”改为“<=”以确定值的赋值的正确

  • 相关阅读:
    佛山Uber优步司机奖励政策(2月1日~2月7日)
    长沙Uber优步司机奖励政策(2月1日~2月7日)
    广州Uber优步司机奖励政策(2月1日~2月7日)
    西安Uber优步司机奖励政策(2月1日~2月7日)
    武汉Uber优步司机奖励政策(2月1日~2月7日)
    Apicloud自定义模块
    Android Studio导出jar包
    android studio 、 as 如何导入eclipse项目
    安卓 使用Gradle生成正式签名apk文件
    如何用Android studio生成正式签名的APK文件
  • 原文地址:https://www.cnblogs.com/little-clever/p/4360779.html
Copyright © 2011-2022 走看看