迴圈陣列的子陣列最大和
阿新 • • 發佈:2018-11-03
一。實驗要求
1.輸入一個整型陣列,數組裡有正數也有負數,陣列中一個或多個整陣列成一個整陣列,每個子陣列都有一個和。
2.陣列可以首位相連,允許A【i-1】,....,A[n-2],A[0]........A[j-1]和最大
3.返回最大子陣列的位置,求最大子陣列的和.
二、實驗思路
迴圈陣列,也就是最後一個數組值和第一個陣列值相連,整個子陣列可以從任何一個整數開始遍歷求出所有的子陣列,參考前面陣列的設計思想,有二種可能的解決方案。
1.對陣列內的每一個數都進行遍歷,然後遍歷以他們為起點,長度最大為陣列長度的所有子陣列,比較各個子陣列的大小,求出最大子陣列的和。
2.從頭開始遍歷,遍歷到陣列A【i】時,最大子陣列的值可能是max+A【i】,也可能為A【i】,做出比較,取最大值.
我們選擇了第一種解決方案,遍歷所有的子陣列求出最大值,因為是迴圈陣列,所以從每一個數開始遍歷其最長子陣列的長度都是陣列的長度,所以我們將陣列通過if迴圈,賦值給長度為陣列長度2n-1的新陣列,設施遍歷長度為n,遍歷出所有子陣列,求出最大值.
三。實驗人員:
袁鳳隆 楊子浩
四。實驗原始碼
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() { int i,d,m,a,h,l,p; int max=0; int b=0; int c [10]; int n [19]; srand(time(NULL)); for(i=0;i<10;i++) { d=rand()%2; if(d==0) { c[i]=rand()%10; } else { c[i]=-rand()%10; } printf("%d ",c[i]); } printf("\n "); for(m=0;m<19;m++) { if(m<10) { n [m]=c [m]; } else { n [m]=c [m-10]; } printf("%d ",n[m]); } for(m=0;m<10;m++) { for (i=m;i<(10+m);i++) { for(a=i;a<(10+i);a++) { d=0; for(h=i;h<=a;h++) { d+=n[h]; if(d>max) { max=d; l=i; p=a; } } } } } if(max==0) { max=c[0]; for(i=0;i<10;i++) { if(max<c[i]) { max=c[i]; l=p=i; } } } if(max>2147483647) printf("piease atart again\n"); printf("\n"); printf("maximum array is=%d\n",max); printf("最大子陣列為\n"); for(i=l;i<=p;i++) { printf(" %d ",n[i]); } return 0; }
五。實驗結果圖片
六。實驗總結。
通過本次實驗深刻的理解實驗思路和將問題降維的重要性,將陣列重新儲存是想通過兩個迴圈實現,最後發現一個if語句就可以實現,真的是太重要,期待下次實驗