c++實現求最大子數組和(結對作業)


設計思想

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個小時。團隊合作幫助很大。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM