設計思想
1.輸入整型數組(1000個元素)
2.動態規划實現最大子數組之和
3.加入int32類型的數值溢出判斷
4.輸出最大子數組之和和其位置。
一.對於一個元素個數較小的int數組,沒有int32數組溢出判斷
1 #include<iostream>
2 using namespace std; 3 int main() 4 { 5 int n,star=0,end=0; 6 //實現整型數組的輸入
7 cout<<"輸入整型數組的長度"; 8 cin>>n; 9 int *p=new int[n]; 10 cout<<"輸入一個整型數組"; 11 for(int i=0;i<n;i++) 12 { 13 cin>>p[i]; 14 } 15 int sum=p[0]; 16 int max_sum=p[0]; 17 //copy的csdn上大神的代碼。注釋為自己理解
18 for(int i=1;i<n;i++) 19 { 20 if(sum>0) //從第二個數開始判斷是否為正數
21 { 22 sum=sum+p[i]; //是正數,將和值(初始值為p【0】)和第i+1個數做和。
23 if(sum>max_sum) // 並判斷是否為最大,是讓其賦值給max_sum,並將子數組末位置改變。
24 { 25 max_sum=sum; 26 end=i; 27 } 28 } 29 else
30 { 31 sum=p[i]; //是負數,將第i+1個數的值賦值給和值sum
32 if(sum>max_sum)//並判斷是否為最大,是讓其賦值給max_sum,並將子數組初、末位置改變。
33 { 34 max_sum=sum; 35 star=i; 36 end=i; 37 } 38 } 39 } 40 cout<<"最大子數組位置為第"<<star+1<<"個到第"<<end+1<<"個"<<endl; 41 cout<<"最大子數組和為"<<max_sum<<endl; 42 return 0; 43 }
結果截圖:
二.一個1000元素個數的數組(為了測試輸入便利,利用隨機數及隨機數種子實現1000個元素),加入int32類型判斷溢出
1 #include<iostream>
2 #include<stdlib.h>
3 #include <time.h>
4 using namespace std; 5 int main() 6 { 7 int n=1000,star=0,end=0; 8 //利用隨機數實現1000個元素,用隨機數只是便於輸入1000個元素的數組。
9 int *p=new int[n]; 10 srand((unsigned)time(NULL)); 11 for(int i=0;i<n;i++) 12 { 13 p[i]=rand()%1000-500; 14 } 15 //打印這個1000個元素的數組
16 for(int i=0;i<n;i++) 17 { 18 cout<<p[i]<<" "; 19 if((i+1)%10==0) 20 { 21 cout<<endl; 22 } 23 } 24 int sum=p[0]; 25 int max_sum=p[0]; 26 //copy的csdn上大神的代碼。注釋為自己理解
27 for(int i=1;i<n;i++) 28 { 29 if(sum>0) //從第二個數開始判斷是否為正數
30 { 31 if(p[i]>(INT_MAX-sum)) //加入了一段判斷int類型數據是否溢出。
32 { 33 cout<<"int類型溢出"<<endl; 34 return 0; 35 } 36 sum=sum+p[i]; //是正數,將和值(初始值為p【0】)和第i+1個數做和。
37 if(sum>max_sum) // 並判斷是否為最大,是讓其賦值給max_sum,並將子數組末位置改變。
38 { 39 max_sum=sum; 40 end=i; 41 } 42 } 43 else
44 { 45 sum=p[i]; //是負數,將第i+1個數的值賦值給和值sum
46 if(sum>max_sum)//並判斷是否為最大,是讓其賦值給max_sum,並將子數組初、末位置改變。
47 { 48 max_sum=sum; 49 star=i; 50 end=i; 51 } 52 } 53 } 54 cout<<"最大子數組位置為第"<<star+1<<"個到第"<<end+1<<"個"<<endl; 55 cout<<"最大子數組和為"<<max_sum<<endl; 56 return 0; 57 }
結果截圖:
三.為了測試出int32類型溢出,將隨機數擴大10^6倍
1 #include<iostream>
2 #include<stdlib.h>
3 #include <time.h>
4 using namespace std; 5 int main() 6 { 7 int n=1000,star=0,end=0; 8 //利用隨機數實現1000個元素,用隨機數只是便於輸入1000個元素的數組。
9 int *p=new int[n]; 10 srand((unsigned)time(NULL)); 11 for(int i=0;i<n;i++) 12 { 13 p[i]=rand()%1000-500; 14 p[i]=p[i]*1000000; 15 } 16 //打印這個1000個元素的數組
17 for(int i=0;i<n;i++) 18 { 19 cout<<p[i]<<" "; 20 if((i+1)%10==0) 21 { 22 cout<<endl; 23 } 24 } 25 int sum=p[0]; 26 int max_sum=p[0]; 27 //copy的csdn上大神的代碼。注釋為自己理解
28 for(int i=1;i<n;i++) 29 { 30 if(sum>0) //從第二個數開始判斷是否為正數
31 { 32 if(p[i]>(INT_MAX-sum)) //加入了一段判斷int類型數據是否溢出。
33 { 34 cout<<"int類型溢出"<<endl; 35 return 0; 36 } 37 sum=sum+p[i]; //是正數,將和值(初始值為p【0】)和第i+1個數做和。
38 if(sum>max_sum) // 並判斷是否為最大,是讓其賦值給max_sum,並將子數組末位置改變。
39 { 40 max_sum=sum; 41 end=i; 42 } 43 } 44 else
45 { 46 sum=p[i]; //是負數,將第i+1個數的值賦值給和值sum
47 if(sum>max_sum)//並判斷是否為最大,是讓其賦值給max_sum,並將子數組初、末位置改變。
48 { 49 max_sum=sum; 50 star=i; 51 end=i; 52 } 53 } 54 } 55 cout<<"最大子數組位置為第"<<star+1<<"個到第"<<end+1<<"個"<<endl; 56 cout<<"最大子數組和為"<<max_sum<<endl; 57 return 0; 58 }
結果截圖:
總結
對於解決最大子數組之和的問題有一定的算法,但實際實現成代碼形式有很大困難,最后借鑒網上大神的代碼並理解才能實現。估計2個半小時,實際用時近3個小時。團隊合作幫助很大。