整数数组的最大子数组

//注:本小队有三人,分别为王友军,黄瑞玻,白宇乾;因本班级人数为奇数,故如此

本次作业为返回整数数组中最大的子数组,应用c++编写,在visual c++ 2010 平台执行。

在编写过程中学会以下知识:

    1. 应用 int n;int *p=new int[n];开辟动态储存空间。满足输入动态数组的要求。
    2. 应用switch语句实现程序功能的多元化。
    3. 使用如下代码判断最大子数组之和。 for(int i=0;i<n;i++)
       {
        cin>>p[i];
       }
       int sum=p[0];
         int max_sum=p[0];
         for(int i=1;i<n;i++)
         {   
             if(sum>0)    //是否为正数
             { 
                 sum=sum+p[i];  //是正数,做和。
                if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum。
                  { 
                      max_sum=sum;
                      end=i;
                  }
             }
             else 
             { 
                 sum=p[i];  //是负数,将第i+1个数的值赋值给和值sum
                    if(sum>max_sum)//并判断是否为最大,是让其赋值给max_sum。
                    {    
                       max_sum=sum;
                       star=i;
                       end=i;
                    }
             }
         }
         cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<"个"<<endl;
         cout<<"最大子数组和为"<<max_sum<<endl;
    4. 应用p[i]=rand()输入随机数组。如果不再加任何条件时数组元素范围为零到32767 (2^16-1),其计算原理为:y=ax+b(mod n)其中,n一般是一个很大的素数,几万。 
      a也是大素数。而且a,b,n都是常数。所以rand的产生决定于x, 
      他被称为seed。 
      每一个seed都是上一次产生的y的函数。这样,如果直接取seed=y的话, 
      虽然产生的rand之间相关性甚小,但只要知道某个y,就能推知以后的rand。 
      为避免这种情况,一般取seed为y和当时计算机的时间的函数,如seed=y+t

      比如VC中对于rand()函数是如下实现的. 
      int __cdecl rand (void) 

      return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff); 
      }
    5. 如果想用rand函数输出负数时,可以这样应用:p[i]=-rand()%4000+2000;
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
    cout<<"数1601-2 20163980 \n黄瑞波"<<endl;;
    int m,n=0,star=0,end=0;
    cout<<"1.手动输入数组。\n2.随机生成数组。请选择功能:";//选择自己输入或者随机生成
    cin>>m;
    switch(m)
    {
        case 1:{
        int *p=new int[n];//开辟为n的存储空间
    cout<<"请输入数组的长度:";
    cin>>n;
    if(n<0)
    {
    cout<<"输入的数组长度有误,请重新输入!"<<endl;//判断数据有效性
    return 0;
    }
    cout<<"输入一个"<<n<<"维整型数组:";
    //以下算法代码参考与网络。
    for(int i=0;i<n;i++)
    {
        cin>>p[i];
    }
    int sum=p[0];
   int max_sum=p[0];
   for(int i=1;i<n;i++)
   {   
       if(sum>0)    //是否为正数
       { 
           sum=sum+p[i];  //是正数,做和。
          if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum。
            { 
                max_sum=sum;
                end=i;
            }
       }
       else 
       { 
           sum=p[i];  //是负数,将第i+1个数的值赋值给和值sum
              if(sum>max_sum)//并判断是否为最大,是让其赋值给max_sum。
              {    
                 max_sum=sum;
                 star=i;
                 end=i;
              }
       }
   }
   cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<""<<endl;
   cout<<"最大子数组和为"<<max_sum<<endl;
};break;
        case 2:
            {
                int *p=new int[n];
                cout<<"请输入数组的长度:";
        cin>>n;
        if(n<0)
        {
        cout<<"输入的数组长度有误,请重新输入!"<<endl;
        return 0;
        }cout<<"随机数组为:";
        for(int i=0;i<n;i++)
    {
        p[i]=-rand()%4000+2000;
        cout<<p[i]<<" ";
    }
        cout<<endl;
        int sum=p[0];
   int max_sum=p[0];
   for(int i=1;i<n;i++)
   {   
       if(sum>0)    //判断是否为正数
       { 
           sum=sum+p[i];  //是正数,做和。
          if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum。
            { 
                max_sum=sum;
                end=i;
            }
       }
       else 
       { 
           sum=p[i];  //是负数,将第i+1个数的值赋值给和值sum
              if(sum>max_sum)//并判断是否为最大,是让其赋值给max_sum。
              {    
                 max_sum=sum;
                 star=i;
                 end=i;
              }
       }
   }
   cout<<"最大子数组位置为:第"<<star+1<<"个到第"<<end+1<<""<<endl;
   cout<<"最大子数组和为:"<<max_sum<<endl;
            };break;
    }
      return 0;
}

运行结果截图为:

 

 

 

 

 

 

posted @ 2018-10-14 18:21  王友军  阅读(111)  评论(0编辑  收藏  举报