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

一、题目要求

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

四、结果截图

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

五、感想体会

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

时间: 2024-11-05 10:09:43

软件工程——一维数组(溢出问题)的相关文章

一维数组求最大子数组(解决溢出问题)

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 程序在宏里面定义出了数组长度的大小,在长度超过100万的时候程序直接崩溃,其实这并不是因为结果太大导致的数值溢出,而是因为内存溢出,我们的数组是定义在程序内部的,属于局部变量,存放位置在栈上

结对开发——一维数组最大子数组判断溢出

一 题目 求一维数组最大子数组和 要求:1000个数以上,整数 二.设计思路 最大子数组很好找到,但是子数组和的溢出问题很难解决. 经过不断的思考,我得出了结论: 溢出是程程序设计者设计时的不足所带来的错误.所以设计者要在编码时便高度警惕,预防溢出的发生,这才是最本质的解决问题的方法.就本题而言,我们设置了元素最大个数,以及其它输入要求,尽量避免溢出的发生.1000个数相加可以实现,但非要取1000个最大的数相加,那样的计算没有意义,不会在我们的生活学习中出现,这属于科研问题,交给大神们来解决吧

结对开发_求一维数组最大子数组和判断溢出

题目 求一维数组最大子数组和 要求:1000个数以上,整数 二.设计思路 最大子数组很好找到,但是子数组和的溢出问题很难解决. 经过不断的思考,我得出了结论: 溢出是程程序设计者设计时的不足所带来的错误.所以设计者要在编码时便高度警惕,预防溢出的发生,这才是最本质的解决问题的方法.就本题而言,我们设置了元素最大个数,以及其它输入要求,尽量避免溢出的发生.1000个数相加可以实现,但非要取1000个最大的数相加,那样的计算没有意义,不会在我们的生活学习中出现,这属于科研问题,交给大神们来解决吧.

求一维数组最大子数组和判断溢出

一题目 一.实验要求 求一维数组最大子数组和 要求:1000个数以上,32位整数 二.设计思路 因为我们的程序一开始就可以运算1000个以上数的运算,最大个数为364,526,269,原因为找出. 这次实验主要目的是解决最大值溢出的问题,本来想输出这个溢出的数值,但没有实现,于是改为若溢出,则输出提示,并返回溢出的上一个最大值. 三.代码 1 // ketang4.cpp : 定义控制台应用程序的入口点. 2 //张世通 梁世豪 3 4 #include "stdafx.h" 5 #i

一维数组最大数溢出判断

结对人员:张世通 梁世豪 一.题目 题目:求一维数组最大子数组的和 要求:能计算1000以上的数组 二.设计思路 我们最初的实现思路是通过字符串数组实现大数的计算,但是没有实现,原因是在用字符串数组进行加法运算时,进位处理还有字符串和整数的转换做不好,所以我们最后决定不再对大数溢出进行处理,而是直接给出大数溢出的异常提醒,并给出上一个正确的运算结果.虽然没有实现用字符串解决大数溢出的问题,但还是列出部分代码,说明我们的思路 1 void Reset (char n[],int a[]) 2 {

软件工程概论---环形一维数组最大子数组和

1,题目要求 求一维数组的最大子数组和,首尾相连成环形,数组包含正数和负数两种. 输出最大子数组的位置. 2,思路设计 一开始的思路是把原来的数组进行扩充,即n个数的数组长度变成了2*n-1. 实际上我们又参考了百度,运用了求余的方法. 如果所有数都是负的,需要加一个判断. 3, 4, 5,

0108练习一维数组

1.编写java程序,创建一维数组 arr[],并将其遍历输出. int arr[]={55,87,48,10,7}; for(int i=0;i<5;i++){ System.out.println(arr[i]); } 2.编写java程序,创建一维数组 arr[],将数组中最大的数输出. int arr[]={456,882,15560,88596,55,224};int max=arr[0];//建立并初始化数组arr,声明变量max=数组中第0个数 for (int m=0;m<ar

C++:一维数组和二维数组

一维数组:int a[c],其中a是数组名称,c是数组维度,数组维度必须是常量表达式!例如: 1 int c=3; 2 int a[c];//错误!由于c不是常量表达式,所以该定义非法.若将c定义为const int,即c成为一个常量表达式,则可正常编译. 数组的初始化: int a[3]={1,2};//正确!等价于a[3]={1,2,0} int b[3]={1,2,3,4};//错误!初始值过多. int c[]={1,2};//正确!等价于c[2]={1,2} string d[3]={

JAVA一维数组

import java.applet.Applet; import java.awt.*; //用*表示包含awt这个源包下的所有方法成员,awt为图形界面设计包 public class Applet_Example extends Applet{ int a[]; //定义一个一维数组 public void init(){ a=new int[5]; //定义一个一维数组,该数组包含5个元素 a[0]=100; //分别对数组元素赋值 a[1]=101; a[2]=102; a[3]=10