一、设计思路
对于大数的溢出,我们没有找到好的方法去储存,只能将临界溢出的数挨个输出。即算出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数组来储存最后的数,但是在也有可能在中间的相加过程中也可能溢出,且用字符数组
相加考虑到进位的问题会比较麻烦,因此舍去这种方法。最后,只能采取在临界时储存,最后再输出的方法。