1. 程式人生 > >團隊作業3返回整數陣列中最大子陣列的和(多個數組)

團隊作業3返回整數陣列中最大子陣列的和(多個數組)

要求:

  1.輸入一個整形陣列,數組裡有整數有負數

  2.陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和

  3.如果陣列A[0].........A[j-1]首尾相鄰,允許A[i-1],..........A[n-1],A[0].......A[j-1]之和最大

  4.同時返回最大子陣列的位置

  5.求所有子陣列的和的最大值

實驗思路:

        首先隨機生成一個二維陣列,再形成子陣列,記錄子陣列個數,然後求每個子陣列和,記錄下來。在隨機生成一個二維陣列,生成子陣列,與上一個陣列的子陣列結成新的子陣列,並且求子陣列的和,將子陣列和形成一個新的陣列,進行遍歷,找到最大值。

程式程式碼:

 

複製程式碼
//返回整數陣列中最大子陣列的和(各陣列首尾相連)
#include<iostream>
#define N 100
using namespace std; //構造子陣列結構 typedef struct SArray { int Sdata; //子陣列中的數 int start; //子陣列的起始位置 int end; //子陣列的終止位置 }SArray; //構造連結串列的儲存結構 typedef struct LNode { int data; //int position; //數所在陣列中的位置 struct LNode *next; //指標 }LNode, *LinkList; //建立迴圈連結串列 void CreateList(LinkList &L, int Group[], int n) { L = new LNode; L->next = NULL; LNode *r; r = L; for (int i = 0; i < n - 1; i++) { LNode *p; p = new LNode; p->data = Group[i]; p->position = i + 1; p->next = NULL; r->next = p; r = p; } LNode *p; p = new LNode; p->data = Group[n - 1]; p->position = n; p->next = L->next; r->next = p; } //返回最大子陣列 SArray Compare(LinkList L, int Length) { SArray MaxSum[N][2]; //MaxSum[N][0].Sdata表示前N-1個數中,最大的子陣列 //MaxSum[N][1].Sdata表示前N-1個數的最大的子陣列和加第N個數的和與第N個數相比的最大值 LNode *r; r = L->next; MaxSum[0][0].Sdata = MaxSum[0][1].Sdata = r->data; MaxSum[0][0].start = MaxSum[0][1].start = r->position; MaxSum[0][0].end = MaxSum[0][1].end = r->position; for (int i = 1; i < Length; i++) { if (MaxSum[i - 1][0].Sdata > MaxSum[i - 1][1].Sdata) { MaxSum[i][0].Sdata = MaxSum[i - 1][0].Sdata; MaxSum[i][0].start = MaxSum[i - 1][0].start; MaxSum[i][0].end = MaxSum[i - 1][0].end; } else { MaxSum[i][0].Sdata = MaxSum[i - 1][1].Sdata; MaxSum[i][0].start = MaxSum[i - 1][1].start; MaxSum[i][0].end = MaxSum[i - 1][1].end; } if (MaxSum[i - 1][1].Sdata + r->next->data > r->next->data) { MaxSum[i][1].Sdata = MaxSum[i - 1][1].Sdata + r->next->data; MaxSum[i][1].start = MaxSum[i - 1][1].start; MaxSum[i][1].end = r->next->position; } else { MaxSum[i][1].Sdata = r->next->data; MaxSum[i][1].start = r->next->position; MaxSum[i][1].end = r->next->position; } r = r->next; } if (MaxSum[Length - 1][0].Sdata > MaxSum[Length - 1][1].Sdata) { return MaxSum[Length - 1][0]; } else { return MaxSum[Length - 1][1]; } } //將含n個數的迴圈陣列依次從各個點斷開,產生n個含n個數組的單鏈陣列 SArray Divide(LinkList L, int length) { LinkList LGroup[N]; //頭節點集合 LNode *r; r = L; for (int i = 0; i < length; i++) { LGroup[i] = r; r = r->next; } SArray MaxGroup[N]; //分成的各個陣列的最大子陣列的集合 for (int i = 0; i < length; i++) { MaxGroup[i].Sdata = Compare(LGroup[i], length).Sdata; MaxGroup[i].start = Compare(LGroup[i], length).start; MaxGroup[i].end = Compare(LGroup[i], length).end; } SArray Max = MaxGroup[0]; //各個陣列的最大子陣列和的最大值 for ( i = 1; i < length; i++) { if (Max.Sdata < MaxGroup[i].Sdata) { Max.Sdata = MaxGroup[i].Sdata; Max.start = MaxGroup[i].start; Max.end = MaxGroup[i].end; } } return Max; } int main() { int Number[N]; //整數陣列 int length; //陣列長度 cout << "請輸入一個整型陣列:" << endl; cin >> Number[0]; length = 1; while (getchar() != '\n') { cin >> Number[length++]; } LinkList L; CreateList(L, Number, length); cout << "該陣列中的最大的子陣列和為:"; cout << Divide(L, length).Sdata << endl; cout << "該最大子陣列的起始位置為:"; cout << Divide(L, length).start << endl; cout << "該最大子陣列的終止位置為:"; cout << Divide(L, length).end << endl; return 0; }
複製程式碼

實驗結果:

作業分工:

  姓名 :郭少周負責程式碼的執行除錯和複核。我負責查詢資料,編寫程式碼。

 

 

實驗心得:這次實驗讓我看到了自己的不足,同時也學習到新的陣列計算方法,一個圓環陣列切開一刀後如何遍歷,有了新的認識,團結力量大。