如何求一个整数循环数组中最大子数组的和
1.设计思想:
我们先思考普通数组的做法,如果是普通数组我们会先设定一个最大值max和判断值sum都初始化为数组第一位的值再由数组第二位开始循环判断sum是否为正:
若为正我们就让sum加上该位的值之后判断sum是否大于max若大于则将max赋值为sum;若不为正则将sum赋值为该位的值再判断sum是否大于max若大于则将max
赋值为sum,这样我们就能得到最大值。
但本题为循环数组所以就增加了问题的难度,但我们可以将此问题理解为每一位都做一次首位的普通数组这样我们就能用上面的方法解决此问题,但要增加移动
数组这一步骤。
2.源代码:
#include<iostream>
using namespace std;
int max_suminsum(int a[], int n)
{
int max_sum_h = a[0];
int t, k = n - 1;
while (k)
{
int sum = a[0];
int max_sum = a[0];
for (int i = 1; i < n; i++)
{
if (sum > 0)
{
sum = sum + a[i];
if (sum > max_sum)
{
max_sum = sum;
}
}
else
{
sum = a[i];
if (sum > max_sum)
{
max_sum = sum;
}
}
}
if (max_sum_h <= max_sum)
{
max_sum_h = max_sum;
}
t = a[n - 1];
for (int i = n - 1; i > 0; i--)
{
a[i] = a[i - 1];
}
a[0] = t;
k--;
}
return max_sum_h;
}
int main()
{
int n, star = 0, end = 0;
int max_sum_h = a[0];
int t, k = n - 1;
while (k)
{
int sum = a[0];
int max_sum = a[0];
for (int i = 1; i < n; i++)
{
if (sum > 0)
{
sum = sum + a[i];
if (sum > max_sum)
{
max_sum = sum;
}
}
else
{
sum = a[i];
if (sum > max_sum)
{
max_sum = sum;
}
}
}
if (max_sum_h <= max_sum)
{
max_sum_h = max_sum;
}
t = a[n - 1];
for (int i = n - 1; i > 0; i--)
{
a[i] = a[i - 1];
}
a[0] = t;
k--;
}
return max_sum_h;
}
int main()
{
int n, star = 0, end = 0;
cout << "请输入数组的大小:" << endl;
cin >> n;
int* p = new int[n];
cout << "请依次输入数组内容:" << endl;
for (int i = 0; i < n; i++)
{
cin >> p[i];
}
cout << "最大子数组的和为:" << max_suminsum(p, n) << endl;
system("pause");
return 0;
}
cin >> n;
int* p = new int[n];
cout << "请依次输入数组内容:" << endl;
for (int i = 0; i < n; i++)
{
cin >> p[i];
}
cout << "最大子数组的和为:" << max_suminsum(p, n) << endl;
system("pause");
return 0;
}
3.效果截图: