zoukankan      html  css  js  c++  java
  • 整数数组的最大子数组

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

    本次作业为返回整数数组中最大的子数组,应用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 
    黄瑞波"<<endl;;
        int m,n=0,star=0,end=0;
        cout<<"1.手动输入数组。
    2.随机生成数组。请选择功能:";//选择自己输入或者随机生成
        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;
    }

    运行结果截图为:

     

     

  • 相关阅读:
    Swagger接入
    Elasticsearch5.0.1索引压测结果
    Elasticsearch5.0 BreakChange摘要
    Elasticsearch1.7到2.3升级实践总结
    Java动态代理全面分析
    Spring之AntPathMatcher
    Lock的实现之ReentrantLock详解
    Elasticsearch之client源码简要分析
    elasticserach 索引删除 源码分析
    httpClient4.5.2工具类总结
  • 原文地址:https://www.cnblogs.com/stdu-412/p/9787284.html
Copyright © 2011-2022 走看看