1.設計思想
(1)首先創建一個一維數組a[],根據用戶輸入的數組長度及數組內容進行存儲數據。
(2)再定義幾個變量,sum用於求和,max為和最大值,num為數組長度。
(3)開始for循環,sum初始化為0,max初始化為a[0]。循環內容為sum+=a[i];如果sum比max大則將sum值賦給max,如果sum小於0,則定義sum=0。直至循環結束,得到最大子數組的和。
(4)尋找a數組最小值,得到其下標j,將j值賦給t。創建數組b,進行兩次循環,第一次循環i=0,每循環一次j值就增加1,b[i]=a[j],當j>=num時,第一次循環結束。進行第二次循環,令sum=0,j=0。每循環一次j值就增加1,b[i]=a[j],當j>=t時,循環結束,便成環。
(5)開始for循環,sum初始化為0,max為未成環之前得到的最大值。循環內容為sum+=b[i];如果sum比max大則將sum值賦給max,如果sum小於0,則定義sum=0。直至循環結束,得到最大子數組的和。
2。源程序代碼
1 //返回一個一維整數數組最大子數組和最大值(有環) 2 package ketang; 3 import java.util.*; 4 public class SumArray { 5 public static void main(String[] args) { 6 Scanner sca=new Scanner(System.in); 7 System.out.println("輸入整數數組數的個數"); 8 int num=sca.nextInt(); 9 int a[],b[]; 10 a=new int[num]; 11 b=new int[num]; 12 System.out.println("輸入數組的數"); 13 int i; 14 for(i=0;i<num;i++) 15 { 16 a[i]=sca.nextInt(); 17 } 18 int t,j=0,sum=0,max=a[0]; 19 for(i=0;i<num;i++) //未成環之前找最大值 20 { 21 sum+=a[i]; 22 if(max<sum) 23 { 24 max=sum; 25 } 26 if(sum<0) 27 { 28 sum=0; 29 } 30 } 31 /* 實現首尾相接 */ 32 int min=a[0]; 33 for(i=0;i<num;i++) //找到最小值 34 { 35 if(min>a[i]) 36 { 37 min=a[i]; 38 j=i; 39 } 40 } 41 t=j; //將最小值下標j值賦給t 42 i=0; 43 while(j<num) 44 { 45 b[i]=a[j]; 46 i++; 47 j++; 48 } 49 j=0; 50 while(j<t) 51 { 52 b[i]=a[j]; 53 i++; 54 j++; 55 } 56 sum=0; //接著初始化sum為0 57 for(i=0;i<num;i++) //連成環之後找最大值 58 { 59 sum+=b[i]; 60 if(max<sum) 61 { 62 max=sum; 63 } 64 if(sum<0) 65 { 66 sum=0; 67 } 68 } 69 System.out.println("最大子數組和為 "+max); 70 } 71 } The Main Code3.結果截圖
4.編程總結
此次編程只需在原來程序基礎上進行改進即可,難點在於如何找到連成環的關鍵位置,關鍵位置找到後形成一個新數組,再利用上次的思想進行尋找最大值即可。
5.psp