1. 程式人生 > >求一個環形陣列最大子陣列的和

求一個環形陣列最大子陣列的和

假如我們輸入一個一維的陣列,陣列中既有正數也有負數,而且這個陣列首尾相接,就像一個圓圈。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。求所有子陣列的和的最大值,如何用程式設計的語言實現?
設計思想:
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; }

 最後附上我們合作的照片: