求一維迴圈陣列的迴圈子陣列
阿新 • • 發佈:2018-11-04
題目:返回一個整數陣列中最大子陣列的和。
要求:
1.輸入一個整形陣列,數組裡有正數也有負數。
2.陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。
3.如果陣列A[0]……A[j-1]首尾相鄰,允許A[i-1],……A[n-1],A[0]……A[j-1]之和最大。
4.同時返回最大子陣列的位置。
5.求所有子陣列的和的最大值。
設計思想:一維迴圈陣列求最大子陣列可以簡化成一維不迴圈陣列求最大子陣列 。
簡化過程:將迴圈陣列由某個位置剪開,展開成一維不迴圈陣列。
原始碼:
1 #include<iostream> 2 #include<stdlib.h> 3#include<time.h> 4 using namespace std; 5 int main() 6 { 7 int i,j,n,b,p,sum,maxsum; 8 int *a; 9 cout<<"請輸入陣列的長度:"<<endl; 10 cin>>n;//陣列的長度 11 cout<<"陣列元素的最大取值:"<<endl; 12 cin>>p; 13 //如果為迴圈陣列是以下操作 14 a=new int[2*n-1]; 15 srand(time(NULL));16 cout<<"生成陣列元素"<<endl; 17 for(i=0;i<n;i++) 18 { 19 a[i]=rand()%(2*p+1)-p ; 20 cout<<a[i]<<'\t';//迴圈陣列的生成為: 21 if(i<n-1) 22 { 23 a[n+i]=a[i]; 24 } 25 26 } 27 cout<<endl; 28 maxsum=sum=0; 29 for(i=0;i<n;i++)//因為要將每個位置剪開展成的一維陣列進行遍歷比較需要兩層迴圈 30 { 31 b=i;//每次剪開展開後的第一個陣列元素的下標 32 for(j=0;j<n;j++) 33 { 34 sum+=a[b++]; 35 if(sum<0) 36 { 37 sum=0; 38 } 39 if(sum>maxsum) 40 { 41 maxsum=sum; 42 } 43 } 44 sum=0;//將每次展開的sum值歸零 45 } 46 if(maxsum==0)//陣列元素全為非負數時的處理 47 { 48 maxsum=a[0]; 49 for(i=0;i<n;i++) 50 { 51 if(maxsum<a[i]) 52 { 53 maxsum=a[i]; 54 } 55 } 56 } 57 cout<<"最大子陣列的和為:"<<maxsum<<endl; 58 system("pause"); 59 return 0; 60 61 }
執行截圖:
總結體會:最開始時沒有考慮到每次遍歷展開子陣列和sum的歸零,試了幾次含有正數時和都會出錯,檢查後發現問題,改正了。
學習到了化繁為簡的程式設計思想。
合作美圖:
(20163953 關甜歡 20163955 王美儀)