標籤:
一、題目要求
題目:返回一個整數數組中最大子數組的和。
要求:
要求程式必須能處理1000 個元素;
每個元素是int32 類型的;
輸入一個整形數組,數組裡有正數也有負數。
數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。
求所有子數組的和的最大值。要求時間複雜度為O(n)。
二、設計思路
將數組第一個和第二個數置為2的63次方,觀察結果是否溢出。
三、原始碼
1 package com.java.lianxi; 2 3 import java.util.Scanner; 4 5 public class lianxi4 { 6 public static void main(String[] args) 7 { 8 int num,i; 9 long sum=0;10 long max;11 Scanner cin=new Scanner(System.in);12 System.out.print("請輸入數組的長度:");13 num=cin.nextInt();14 long array[]=new long[num];15 array[0]=(long)Math.pow(2,63);16 array[1]=(long)Math.pow(2,63);17 max=array[0];18 for(i=2;i<num;i++)19 {20 if((int)(Math.random()*2)==0)21 {22 array[i]=(long)(Math.random()*100000000);23 }24 else25 {26 array[i]=-(long)(Math.random()*100000000);27 }28 }29 for(i=0;i<num;i++)30 {31 if(sum<=0)32 {33 sum=array[i]; 34 }35 else36 {37 sum=sum+array[i];38 }39 if(sum>max)40 {41 max=sum;42 }43 }44 if(max==(long)Math.pow(2,63))45 {46 System.out.println("大數溢出");47 System.out.print("子數組和的最大值為:"+max);48 }49 else50 {51 System.out.print("子數組和的最大值為:"+max);52 }53 }54 55 }
四、運行結果
五、心得體會
通過測試,發現當溢出時,最大子數組的和恒為2的63次,也就是long型所能表示的最大整數,出現大數溢出,所得的不是我們想要的結果。
我們想了很久也沒有想出來有什麼解決辦法,因為資料類型所能表示的數就那麼大,但是如果想得到正確的結果,我們可以不輸出一個最終結果,可以輸出幾個數相加,
但是考慮到相加的幾個數都要控制在2的63次方之內。
還想了一個就是可以把最後結果當成兩個變數來顯示,高位放在其中一個變數,低位放在另一個變數,但是我們都沒有實現。
軟體工程結對開發——一維最大子數組求和溢出問題