標籤:
一、題目及要求:
題目:返回一個整數數組中最大子數組的和
要求(新加):①如果數組A[0]...A[j-1]首尾相鄰,允許A[i-1]...A[n-1],A[0]...A[j-1]之和最大;②同時返回最大子數組的位置。
結對人員:胡亞寶 焦燕
二、設計思路:
我們要解決兩個問題:求出環數組中最大的子數組;並且定位出該子數組的位置,把它們的名稱輸出來。要解決這兩個問題,我們從以下兩個方面入手:
①求出最大子數組:將數組數值按順序排好稱為“一趟”,每求出一趟的最大子數組後,將第一個數值放到最後一個,排成新的一趟,以此類推,直到遍曆完成,求出最大環子數組。
②定位子數組:判斷出當前求的和值為負數時,將之捨去,並將該數的下一個數的位置存起來作為最大子數組的頭。當求出最大值後,該數的位置存起來作為子數組的尾。最後輸出將子數組的名稱。
三、原始碼:
1 //結對開發——胡亞寶 焦燕 2 3 #include "stdafx.h" 4 5 6 int _tmain(int argc, _TCHAR* argv[]) 7 { 8 int i,j,k,m,n,o,a[5]; 9 int Sum,Max,flag,flag1=0,flag2,flag4;10 11 printf("請輸入5個整數:\n");12 for(k=0;k<5;k++)13 {14 scanf("%d",&a[k]);15 }16 Max = a[0];17 for (m=0;m<5;m++)18 {19 for(i=0;i<5;i++) 20 { 21 Sum = 0; 22 for(j=i;j<5;j++) 23 { 24 Sum =Sum+ a[j];25 if(Sum<=0)26 {27 Sum=0;28 flag1=(j+1+m)%5;29 }30 if(Sum > Max) 31 {32 Max =Sum; 33 flag2=j+m; 34 }35 } 36 } 37 flag=a[0];38 for(n=0;n<5;n++)39 {40 a[n]=a[n+1];41 }42 a[4]=flag;43 }44 if(Sum==0)45 {46 47 Max=a[0];48 for(int e=0;e<5;e++)49 {50 if(a[e]>=Max)51 {52 Max=a[e];53 flag4=e;54 }55 }56 57 }58 printf("最大連續環子數組的和為:%d\n",Max);59 printf("該最大連續環子數組為:");60 61 if(Sum==0)62 {63 printf("a[%d]",flag4);64 }65 else66 {67 int flag3=flag2-flag1;68 for(o=0;o<=flag3;o++)69 {70 printf("a[%d]\t",flag1);71 flag1++;72 if(flag1>4)73 flag1=0;74 }75 }76 printf("\n");77 return 0;78 }
四、測試及運行結果:
測試資料:
3 6 -9 0 7(有正數、負數、零)
7 9 3 2 8 (只有正數)
-3 -6 -9 -2 -5(只有負數)
運行結果:
五、心得體會:
這次實驗我們聽了老師的要求後,兩個人都各自想實現的方法,然後各自說出自己的方法給對方聽,結果兩人說著說著就知道自己的演算法錯誤在哪,缺點在哪。最後我們決定採用張世通同學的方法。
利用原來的代碼使每求出一趟的最大子數組後,利用for迴圈將第一個數值放到最後一個,排成新的一趟,以此類推,直到遍曆完成,求出最大環子數組;但是在定位時,我們遇到了困難,胡亞寶和我在周六試了一下午才實現。當時特別有成就感,雖然方法是胡亞寶想出來的,但當時特別有成就感。
工作照:
軟體工程課堂訓練——結對開發之環數組最大和