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

     设计思想:
    此次的实验沿用上次的算法,实现数组首尾相接可以将数组长度扩大一倍,后面的一半赋值前面数组的数值,经过N次循环,让数组每一位元素分别作首位,在此向后数N位,则为此次循环的数组,分别计算每次的最大子数组,将N个最大子数组和存入另一个数组中,经过比较得出最大的一个子数组和。
    此程序另一难点在于要把数字定义为int32型,不要忘了把求和部分定义成更大的数字类型,才不会溢出。
    组成员吕兰兰网址:http://www.cnblogs.com/lvlan/

    //禹慧慧 吕兰兰 2016.3.26
    //将数组看成环形,首尾相接,数组元素个数最多1000,数组元素为32位,计算最大子数组的元素之和
    #include<iostream>
    #include<time.h>
    #define RAND16 ((rand()<<1) + (rand()&1))
    using namespace std;
    int main()
    {   
        srand(time(0));
        _int32 Array_a[2000];
        long long Array_max[1000];//存放每个子数组的最大数组之和
        long long arrayOfmax;//存放最后结果最大数
        int N;//随机生成数组元素个数
        N=rand()%1000+1;
        cout<<"数组元素个数为:"<<N<<endl;
        for(int i=0;i<N;i++)
        {
            Array_a[i]=(RAND16 << 16) + RAND16;//生成32位数组元素
        }
        //将数组复制一遍加宽数组的长度
        for(int i=0;i<N;i++)
        {
            Array_a[N+i]=Array_a[i];
        }
        for(int i=0;i<N;i++)
        {
            cout<<Array_a[i]<<"  ";
            if((i+1)%5==0){cout<<endl;}
        }
        cout<<endl;
        //求每个圆环的N个数组的最大的子数组
        for(int j=0;j<N;j++)
        {
            
            long long max=0;
            long long sum=0;
            for(int i=j;i<(N+j);i++)
           {
              sum+=Array_a[i];//将每位求和赋给sum
               if(Array_a[i]>=0)
              {
                 if(max<sum)
                {
                   max=sum;
                }
    
              }
                 if(sum<0)
                {
                   sum=0;
                 }
           }
            if(max==0)
            {
                max=Array_a[0];
               for(int i=j;i<N+j;i++)
              {
                if(Array_a[i]>max)
                 max=Array_a[i];
              }
            }
            Array_max[j]=max;    
      }
        cout<<"The max array is:";
        arrayOfmax=Array_max[0];
        for(int k=1;k<N;k++)
        { 
            if(arrayOfmax<Array_max[k])
            {
                arrayOfmax=Array_max[k];
            }
        }
        cout<<arrayOfmax<<endl;
    
    return 0;    
    }
      
    

      

    运行结果:

    总结:

    程序还是很不完善,最后出现了意料之外的错误,有计算错误,却找不出出错的地方。孟晨助教为我们提出了一下的问题:

    * 程序计算环状列表最大子序列和正确,但没有给出子序列的位置

    * 没有代码复审或测试,或有复审和测试但仍有明显漏洞

    * 没有总结分析;或总结中没有实际内容:对本次编程的分析或遇到的问题和解决方法

  • 相关阅读:
    HDU3336 Count the string —— KMP next数组
    CodeForces
    51Nod 1627 瞬间移动 —— 组合数学
    51Nod 1158 全是1的最大子矩阵 —— 预处理 + 暴力枚举 or 单调栈
    51Nod 1225 余数之和 —— 分区枚举
    51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
    51Nod 机器人走方格 V3 —— 卡特兰数、Lucas定理
    51Nod XOR key —— 区间最大异或值 可持久化字典树
    HDU4825 Xor Sum —— Trie树
    51Nod 1515 明辨是非 —— 并查集 + 启发式合并
  • 原文地址:https://www.cnblogs.com/yhhzxcvbnm/p/5322985.html
Copyright © 2011-2022 走看看