结对开发_数组(溢出)

一、设计思路

    对于大数的溢出,我们没有找到好的方法去储存,只能将临界溢出的数挨个输出。即算出int型最大的数pow(2,30),

  相加之后与之比较大小,若小于,则继续相加,否则,存到一个数组里,并在完成相加之后挨个输出。

二、源代码

  

# include <iostream>
# include <time.h>
# include <math.h>
using namespace std;
#define LENGTH 10
# define TEMPLEN 100
int Arr[LENGTH];
int TEMP[TEMPLEN];                                //存放中间结果的数组
int MaxSubArr(int * arr,int & count,int & temp)
{
    int max=0;
    int flag=true;
    int max1=arr[0];                            //存储全是负数的数组中最大的值
    int k = pow(2.0,30.0);                    
    for(int i=0;i<LENGTH;i++)            //判断数组中是否全部为负数
    {
        if(arr[i]>max1)
        {
            max1=arr[i];
        }
        if(arr[i]>0)
            flag=false;
    }
    if(flag)
        return max1;
    for(int i=0;i<LENGTH;i++)
    {
        temp+=arr[i];
        if(temp>=k)
        {
            TEMP[count++]=temp;
            temp=0;
        }
        if(temp>max)
        {
            max=temp;
        }
        if(temp<0)
        {
            temp=0;
        }
    }
    return max;
}

//测试函数
int main()
{
    srand(time(NULL));
    int max;
    int k;
    int temp=0;                                //存放中间结果
    int count=0;                                //计算TEMP数组中存放了几个中间结果
    for(int i=0;i<LENGTH;i++)
    {
        //k=rand()%10001-5000;                //生成-5000~+5000的随机数
        int k = pow(2.0,28.0);
        Arr[i]=k;
    }
    for(int i=0;i<LENGTH;i++)
    {
        cout<<Arr[i]<<" ";
    }
    cout<<endl;
    max = MaxSubArr(Arr,count,temp);
    cout<<"最大子数组和为: ";
    for(int i=0;i<count;i++)
        cout<<TEMP[i]<<"+";
    cout<<temp<<endl;
    return 0;
}

三、运行结果

  结对开发_数组(溢出)

四、总结

  我们本来的想法是用char数组来储存最后的数,但是在也有可能在中间的相加过程中也可能溢出,且用字符数组

 相加考虑到进位的问题会比较麻烦,因此舍去这种方法。最后,只能采取在临界时储存,最后再输出的方法。