軟工程第三次作業
題目:最大連續子數組和(最大子段和)
問題: 給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
例如,當(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)時,最大子段和為20。
-- 引用自《百度百科》
??解題思路:本著計算機就是能夠重復做簡單的事的思想,在不考慮算法復雜度的前提下最簡單的方法莫過於暴力模擬各種情況了,通過兩層循環將原數組各個子數組和求出來,同時進行比較篩選想要的數組,既為最大子數組和
代碼1(C++)
#include<iostream> using namespace std; int main() { int iNum; int iSummary = 0; int iTemp = 0; cin >> iNum; int *a = new int[iNum]; for(int i = 0; i < iNum; i++) { cin >> a[i]; } for(int i = 0; i < iNum; i++) { for(int j = i; j < iNum; j++) { iSummary = 0; for(int k = i; k <= j; k++) { iSummary += a[k]; } if(iSummary > iTemp ) { iTemp = iSummary; } } } cout << iTemp; return 0; }
codingnet地址:https://coding.net/u/fashow/p/software_engineering/git/blob/master/summary.cpp?public=true
代碼2(JAVA)
import java.util.Scanner; public class Sequence{ public static void main(String[] args) { // Scanner iNum = new Scanner(System.in); // int size = inum.nextint(); // int[] seq = new int[size]; // for(int i = 0; i < size; i++) { // seq[i] = inum.nextint(); // } // inum.close(); int Seq[] = {1,-2,-3,-4,5,6}; int test; test = MaxSeq(Seq , 6); System.out.println(test); } public static int MaxSeq(int [] Seq,int size){ int iSummary = 0; int iTemp = 0; for(int i = 0; i < size; i++) { for(int j = i; j < size; j++) { iSummary = 0; for(int k = i; k <= j; k++) { iSummary += Seq[k]; if(iSummary > iTemp) { iTemp = iSummary; } } } } return iTemp; } }
codingnet地址:https://coding.net/u/fashow/p/software_engineering/git/blob/master/Sequence.java?public=true
程序運行結果
(代碼2)測試代碼(條件覆蓋)
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
class SequenceTest {
@Test
void testMaxSeq() {
int Seq[] = {1,2,-3,4,5,-6,7,-8};
assertEquals( 10 ,new Sequence().MaxSeq(Seq,8));
}
}
測試結果如圖
代碼地址:https://coding.net/u/fashow/p/software_engineering/git/blob/master/SequenceTest.java?public=true
??題目不難但是忙活一下午,領悟到一個道理,懂得了什麽叫紙上談兵,好幾天不碰的東西真的出乎意料的生疏。這以後會是我的飯碗,認真對待下去不僅僅是對理論的鞏固,更是個人能力的加強,真的是只要有接觸到就是在不停的學習,一個大寫加粗的加油。
軟工程第三次作業