能返回一個環形陣列中最大子陣列的和的小程式
要求:
1.輸入一個整形陣列,數組裡有正數也有負數。
2.陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。
3.求所有子陣列的和的最大值。
思路:
做個專案時,我的想法是基於之前做的“能返回一個整陣列中最大子陣列的和”專案之上,它已經有能找出一個數組中最大子陣列的功能,那麼我要解決的問題就是把環形陣列變成之前專案能處理的普通一維即可,就是需要在不同結點將環形陣列斷開,然後我想到了for迴圈能解決這個問題,就是把第一個數的值賦給陣列中最後一個數的後面一個數,使第一個數為0,然後將第二個數放在現在陣列中最後一個數的後面一個數,使第二個數為0,以此類推:
for(int z=1;z<x+1;z++)
{
Number[length++]=Number[z-1];
Number[z-1]=0;
假設我們輸入了陣列 :1 2 3 4 5
這段程式碼將生成五個陣列:0 2 3 4 5 1
0 0 3 4 5 1 2
0 0 0 4 5 1 2 3
0 0 0 0 5 1 2 3 4
0 0 0 0 0 1 2 3 4 5
我也做了一段測試程式碼來檢驗能否正確生成我們需要的陣列:
for(y=0;y<length;y++)
cout<<Number[y]<<endl;
將這兩段程式碼插入到上次的專案之後,會有很多最大值結果(切斷後有幾種陣列就有幾個最大值結果),但我需要一個最大的結果,於是我想到了if語句,如果a小於當時一維陣列的最大值,就讓它等於那個最大值:
if(a<Compare(Number, length))
a=Compare(Number, length);
程式程式碼如下:
#include<iostream> #define N 1000 using namespace std; int Compare(int Group[], int Length) { int MaxSum[N][2]; MaxSum[0][0] = MaxSum[0][1] = Group[0]; for (int i = 1; i < Length; i++) { MaxSum[i][0] = __max(MaxSum[i - 1][0], MaxSum[i - 1][1]); MaxSum[i][1] = __max(MaxSum[i - 1][1] + Group[i], Group[i]); } return __max(MaxSum[Length - 1][0], MaxSum[Length - 1][1]); } int main() { int Number[N]; int length; int y,x,a; a=0; cout<<"請輸入陣列的長度:"<<endl; cin>>x; cout<<"請輸入一個環形陣列:"<<endl; cin>>Number[0]; length=1; while (getchar()!='\n') { cin>>Number[length++]; } for(int z=1;z<x+1;z++) { Number[length++]=Number[z-1]; Number[z-1]=0; /*for(y=0;y<length;y++) cout<<Number[y]<<endl;//測試能否正確的生成切斷後的環形陣列*/ /*printf("%d",Compare(Number, length));//返回每個切斷後陣列的值*/ if(a<Compare(Number, length)) a=Compare(Number, length); } cout << "該陣列中的最大的子陣列和為:"; cout << a << endl; system("pause"); return 0; }
執行截圖如下:
測試程式碼執行效果如下:
設計手稿如下:
總結:因為這次設計思路比較清晰,程式設計整個過程遇到的阻力較小,主要是程式巢狀問題,語句放置位置不對,程式執行的結果會非常奇怪,這時就需要運用測試程式碼或者設中斷結點執行,這樣錯誤會很快被找到,這也是最近學到的技巧。總之能編出來這個程式還是比較開心吧。
日期 | 專案內容 | 時間(小時) |
2018.11.01 | 二柱子四則運算判斷答題對錯 |
2.5 |
2018.11.02 | 二柱子四則運算錯題存入txt | 2 |
2018.11.04 | 返回環形陣列中子陣列最大值 |
2 |