求一個環形陣列最大子陣列的和
阿新 • • 發佈:2018-11-03
假如我們輸入一個一維的陣列,陣列中既有正數也有負數,而且這個陣列首尾相接,就像一個圓圈。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。求所有子陣列的和的最大值,如何用程式設計的語言實現?
設計思想:
1.首先定義一個數組與這個陣列的長度,然後輸入這個陣列。
2.再定義一個新的陣列,此陣列把第一個陣列的數字儲存後再儲存一次(用for迴圈進行陣列資訊的儲存),例子:如第一個陣列為4 5 6 ;則第二個陣列為4 5 6 4 5 6 。
3.再定義三個 int 型別的變數, nowsum(儲存暫時的和)、maxsum(儲存和的最大值)還有 x(用於控制開始位置和子陣列的最大長度,不能高於第一個陣列的長度)。運用for迴圈進行對nowsum的更新,如果 nowsum>maxsum,則 maxsum 進行更新,反之不更新。例子:如第一個陣列為4 5 6 ;則第二個陣列為4 5 6 4 5 6 。nowsum 依次為4,4 5,4 5 6,5,5 6,5 6 4,……最終結果為15,子陣列為4 5 6。
下面是具體的程式碼:
#include "stdafx.h" #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { int i,k=0,count,count2,num1[100],num2[100]; printf("請輸入數字個數,不超過50:"); scanf("%d",&count); count2=count*2; printf("請輸入數字:"); for(i=0;i<count;i++) { scanf("%d",&num1[i]); }for(i=0;i<count2;i++) { if(i<count) { num2[i]=num1[i]; } else { num2[i]=num1[i-count]; } } int x=0,maxsum = 0,nowsum = 0; for(i=x;i<count+x;i++) { nowsum=nowsum+num2[i]; if(nowsum>maxsum) { maxsum=nowsum; } else { maxsum=maxsum+0; } if(i==count-1+x) { x++; if(x<count) { i=x-1; nowsum=0; } else { break; } } } printf("最大子陣列的和:%d\n",maxsum); return 0; }
最後附上我們合作的照片: