zoukankan      html  css  js  c++  java
  • 软件工程——一维数组(溢出问题)

    一、题目要求

      题目:返回一个整数数组中最大子数组的和。
      要求:
        要求程序必须能处理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; }

    四、结果截图

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

          

    五、感想体会

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

  • 相关阅读:
    css3动画之1--animation小例子
    炎炎夏日,走入美妙的前端设计案例
    模拟腾讯、携程、百度音乐 移动端图片切换第一版
    仿QQ空间长图效果简易版--母亲节感恩
    001-搭建框架
    javascript事件绑定1-模拟jquery可爱的东西
    图片尺寸
    mvc3结合spring.net-依赖注入
    *创建索引初步
    Lucene的分词_中文分词器介绍
  • 原文地址:https://www.cnblogs.com/d12138/p/4379033.html
Copyright © 2011-2022 走看看