1. 程式人生 > >迴圈陣列的子陣列最大和

迴圈陣列的子陣列最大和

一。實驗要求

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語句就可以實現,真的是太重要,期待下次實驗