• 软件工程——一维数组(溢出问题)


    一、题目要求

      题目:返回一个整数数组中最大子数组的和。
      要求:
        要求程序必须能处理1000 个元素;
        每个元素是int32 类型的;
        输入一个整形数组,数组里有正数也有负数。
        数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
        求所有子数组的和的最大值。要求时间复杂度为O(n)。

    二、设计思路

                初看到数值超出表示范围溢出的时候,首先想到的是汇编中的高位、地位,

          于是便想到将数值分成高位和低四位,分别用“%”和“/”求出高地位再进行

          计算和输出。

    三、源代码

    //作者:赵建松、张文冬
    #include<iostream> #include<ctime> #define N 1000 #define M 100000 using namespace std; int main() { int count=0; srand((unsigned)time(NULL)); long int * arr=new long int[N]; long int result_h,result_l,k=0;//sum=0; long int high=0,low=0,count1=0,count2=0,c1=0,c2=0; // cout<<"随机产生"<<M<<"个数值: "<<endl; for ( long int i=0; i<N; i++ ) { //cin>>arr[i]; arr[i]=214789635 ; } result_h=arr[0]/M; result_l=arr[0]%M; if(arr[0]<0) result_l*=(-1); for (int s=0;s<N;s++) { cout<<"第"<<(s+1)<<"个元素为:"<<arr[s]<<endl; } for ( int long j=0; j<N; j++ ) { if ( high>=0 ){ c2=j; low=low+arr[j]%M; high=high+arr[j]/M+low/M; low=low%M; if(arr[j]<0) low*=(-1); count++; } else { c1=j; low=arr[j]%M; if(arr[j]<0) low*=(-1); high=arr[j]/M; count=1; } if( result_h<high||(result_h==high && (result_l>0 && result_l<low)||(result_l<0 && result_l>low))) { count1=c1; count2=c2; result_h=high; result_l=low; } } cout<<endl<<"从第"<<(count1+1)<<"到第"<<(count2+1)<<"个元素为最大子数组"<<endl<<endl; if(result_l==0){ cout<<"最大数组之和:"<<result_h<<result_l<<"0000"<<endl<<endl; } else cout<<"最大数组之和:"<<result_h<<result_l<<endl<<endl; return 0; }

    四、结果截图

             由于要看溢出时输出的效果,便在程序中给了数组初值,而不是随机生成的。

          

    五、感想体会

           本次结对开发时,我和赵建松是每个人都先自己想一些解决的方法,认真思考后再两个人一起讨论所有方法的可行性,这样比较容易寻求出一个对问题最优的解决方案。集两个人的方法,在最后实现的时候选择更多一些。

  • 相关阅读:
    bzoj 1188 [HNOI2007]分裂游戏(SG函数,博弈)
    poj 3710 Christmas Game(树上的删边游戏)
    poj 1704 Georgia and Bob(阶梯博弈)
    110 最小路径和
    109 数字三角形
    63 搜索旋转排序数组II
    62 搜索旋转排序数组
    61 搜索区间
    58 四数之和
    关于初始值的问题
  • 原文地址:https://www.cnblogs.com/d12138/p/4379033.html
Copyright © 2020-2023  润新知