1. 程式人生 > >返回一個環狀整數陣列中最大整陣列的和

返回一個環狀整數陣列中最大整陣列的和

一、設計思想

環狀陣列的特點是收尾相連,從而可以達到普通一維陣列不能達到的子陣列結組,所以我呼叫一個函式,函式中新定義一個數組,該陣列的元素個數為輸入陣列的2n-1,之後再對這個陣列以原陣列大小的方式依次找到這些陣列當中的最大子陣列,再在這些子陣列中找到最大的。

二、原始碼

#include<stdio.h>
#define N 1000
#define INF 10000
int maxsubsum(int *arr,int n,int Size)
{
 int sum=0;
 int maxSum=-INF;
    for(int i=n;i<n+Size;i++)
 {
     if(sum<0)
  {
   sum=arr[i];   
  }
  else
  {
   sum+=arr[i];
   if(maxSum<sum)
    maxSum=sum;
  }
 }
 return maxSum;
}
 
int seekmax(int *arr,int Size)
{
    int m=arr[0];
    for( int i = 0; i < Size; i++)
    {
        if(m<arr[i])
        {
           m=arr[i];
        }
    }
    return m;
}   int circlemax(int *arr,int Size) 
{
    int j;
 j=2*Size-1;
 int arr1[N];
 for(int k=0;k<j;k++)
 {
 arr1[k]=arr[k];
 if(k>Size-1)
 arr1[k]=arr[k-Size];
   
 }
 int maxsub[N];
 for(int k1=0;k1<Size;k1++)
 {
 maxsub[k1]=maxsubsum(arr1,k1,Size);
 }
 int max;
 max=seekmax(maxsub,Size);
 return max;
}   int main()
{
     int MSS;
     int i;
     int j=0;//計數器
  int arr[N]={0};
  char c;//用來判斷終止輸入
  printf("Please input N nunmbers:\n");
     for(i=0;i<N;i++)
  {
  scanf("%d",&arr[i]);
  scanf("%c",&c);
   j++;
  if(c=='\n')
  {
  break;
  }
  }
printf("\n");
MSS=circlemax(arr,j);
printf("最大子陣列和=%d\n",MSS);
return 0;
} 三、執行結果截圖
四、出現的問題 沒有問題出現。 五、心得體會 本次練習還是基於之前的練習之上,很快便有了思維,只是落實到程式碼的過程比較漫長,考慮如何在建立的新的陣列中找出合理的最大的子陣列花了不少的時間,但結果還算滿意,還需練習! 六、工作合照