一、设计思想
环状数组的特点是收尾相连,从而可以达到普通一维数组不能达到的子数组结组,所以我调用一个函数,函数中新定义一个数组,该数组的元素个数为输入数组的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;
}
#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 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;
}
{
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;
}
三、运行结果截图
四、出现的问题
没有问题出现。
五、心得体会
本次练习还是基于之前的练习之上,很快便有了思维,只是落实到代码的过程比较漫长,考虑如何在创建的新的数组中找出合理的最大的子数组花了不少的时间,但结果还算满意,还需练习!
六、工作合照