第一種算法(很麻煩)
設計思想:
1.通過随機數産生十個數。
2.聲明一些變量,包括:
flag —— 用來控制子數組的長度,從一到十遞增。
sum —— 記錄最大子數組的和,初始值為a[0]。
s_temp —— 記錄不斷更新的子數組的和。
3.通過一個while語句和兩個for循環實作。需注意第二個for循環中,為防止數組越界,使用Math.min方法。
源代碼:
int a[] = new int[10];
for(int i = 0;i < 10;i++){
a[i] = (int)(Math.random() * 20 - 10); // 産生的随機數範圍在-9 ~ 9
}
System.out.print("産生的随機數的值為:");
for(int i = 0;i <10;i++){
System.out.print(a[i] + " ");
}
System.out.print("\n");
int sum = a[0],s_temp = 0,flag = 1;
while(flag < 10){
for(int j = 0;j < 10;j++){
s_temp = 0;
for(int k = j;k < Math.min(j+flag,10);k++){
s_temp = s_temp + a[k];
}
if(s_temp > sum){
sum = s_temp;
}
}
flag++;
}
System.out.println("最大子數組的和為:" + sum);
}
運作結果:
第二種方法:
當我們加上一個正數時,和會增加;當我們加上一個負數時,和會減少。是以,當接下來的和使現在的和更小時,抛棄它。當目前的和大于最大值,更新最大值。
1 int a[] = new int[10];
2 for(int i = 0;i < 10;i++){
3 a[i] = (int)(Math.random() * 20 - 10); // 産生的随機數範圍在-9 ~ 9
4 }
5 System.out.print("産生的随機數的值為:");
6 for(int i = 0;i <10;i++){
7 System.out.print(a[i] + " ");
8 }
9 System.out.print("\n");
10 int sum = a[0],s_temp = a[0];
11 for(int i = 1 ;i < 10;i++){
12 s_temp = s_temp + a[i];
13 if(s_temp < a[i]){
14 s_temp = a[i];16 }
17 if(s_temp > sum){
18 sum = s_temp;21 }
22 }
23
24 System.out.println("最大子數組的和為:" + sum);