課堂練習(返回一個整數數組中最大子數組的和),整數數組
1.設計思想
只用一個主函數即可完成。
首先,定義一個整型數組,讓用戶輸入一組整數。
然後,判斷這一組數的正負還有零的情況。
最後,根據判斷出來的情況進行選擇執行 if 語句,情況分別為全為0,負數和0,正數和0還有正數負數和0。
2.源代碼

![]()
1 /*
2 * For the maximum of the subarray of an integer array
3 * The start time 2016/4/8 16:50
4 * The end of time 2016/4/8 18:30
5 * Author Jing
6 */
7 package arraymax;
8 import java.util.*;
9 public class SumArray {
10
11 public static void main(String[] args) {
12
13 Scanner sca=new Scanner(System.in);
14 System.out.println("輸入整數數組數的個數");
15 int num=sca.nextInt();
16
17 int a[]=new int[num],b[]=new int[num];
18 int i;
19 System.out.println("輸入此組整數數組");
20 for(i=0;i<num;i++)
21 {
22 a[i]=sca.nextInt();
23 }
24 int l=0,j=0,k=0,sum=0,max;
25 for(i=0;i<num;i++)//判斷輸入數組的正負情況
26 {
27 if(a[i]>=0)
28 {
29 j++;
30 }
31 if(a[i]<0)
32 {
33 k++;
34 }
35 if(a[i]==0)
36 {
37 l++;
38 }
39 }
40 if(k==num)//全為負數
41 {
42 max=a[0];
43 for(i=1;i<num;i++)
44 {
45 if(max<a[i])
46 {
47 max=a[i];
48 }
49 }
50 System.out.println("最大子數組和為 "+max);
51 }
52 else if((l+k)==num)//只有負數和0
53 {
54 System.out.println("最大子數組和為 0");
55 }
56 else if(j==num)//全為非負數
57 {
58 for(i=0;i<num;i++)
59 {
60 sum+=a[i];
61 }
62 System.out.println("最大子數組和為 "+sum);
63 }
64 else
65 {
66 for(i=0;i<num-1;i++)
67 {
68 if(a[i]>=0&&a[i+1]>=0)
69 {
70 a[i+1]=a[i]+a[i+1];
71 a[i]=0;
72 }
73 if(a[i]<0&&a[i+1]<0)
74 {
75 a[i+1]=a[i]+a[i+1];
76 a[i]=0;
77 }
78 }
79 k=0;
80 j=0;
81 while(k<num)//循環完成後b[]中只有正負數
82 {
83 if(a[k]!=0)
84 {
85 b[j]=a[k];
86 j++;
87 }
88 k++;
89 }
90 if(b[0]<0) //尋找第一個正數的下標
91 {
92 i=1;
93 }
94 else
95 {
96 i=0;
97 }
98 while(i<j-2)//只有正數和負數時進行計算
99 {
100 if(b[i]>(-b[i+1]) && (-b[i+1])<b[i+2])
101 {
102 b[i+2]=b[i]+b[i+1]+b[i+2];
103 b[i]=0;
104 b[i+1]=0;
105 i=i+2;
106 }
107 else
108 {
109 i=i+2;
110 }
111 }
112 max=b[0];
113 for(i=1;i<j;i++)
114 {
115 if(max<b[i])
116 {
117 max=b[i];
118 }
119 }
120 System.out.println("最大子數組和為 "+max);
121 }
122 }
123 }
The Main Code
3.結果截圖





4.編程總結
由於時間問題,此程序編的有些倉促,還有很多不足之處,以及需要優化的地方。在空余時間裡,我再繼續思考,爭取編出一個最起碼自己滿意的程序。