信仰2016

导航

 

题目要求:

返回一个整数数组中最大子数组的和。

输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。

设计思路:

从尾往头扫描,找出最大值max1,并记录最大位置i,再从头往尾扫描,找出最大值max2, 并记录最大位置j,若i>j,则比较max1+max2与max,求出最大值,若i<=j,则令max = A[0]+A[1]+A[2]+...A[n-1],求出max和MaxSum之间的最大值,即最后比较MaxSum和sum的值。

#include<iostream>
using namespace std;
int FindMaxSum(int A[], int n)

{
    int value;
    int start, end;
    //用来保证输入数组正确
    if (A == NULL || n <= 1)

    {
        cout << "error input" << '\n';//报错,用户提醒
        exit(0);//异常退出
    }
    //一个元素的数组
    if (n == 1)
        return A[0];
    //从前往后找最大子数组的和
    int pos = 0;
    int CurSum = A[0];
    int MaxSum = A[0];
    for (int i = 1; i<n; ++i)
    {
        if (CurSum <= 0)
            CurSum = 0;
        CurSum += A[i];
        if (CurSum >= MaxSum)
        {
            MaxSum = CurSum;
            pos = i;
        }
    }
    int pos1 = 0, max1 = A[0];
    CurSum = A[0];
    for (int i = 1; i <= n - 1; ++i)
    {
        CurSum += A[i];
        if (CurSum >= max1)
        {
            max1 = CurSum;
            pos1 = i;
        }
    }
    //从后往前找最大子数组的和
    CurSum = A[n - 1];
    int pos2 = n - 1, max2 = A[n - 1];
    for (int j = n - 2; j >= 0; --j)
    {
        CurSum += A[j];
        if (CurSum >= max2)
        {
            max2 = CurSum;
            pos2 = j;
        }
    }
   //对首尾相接情况的处理
    int sum = 0;
    if (pos1 >= pos2)
    {
        for (int i = 0; i<n; ++i)
            sum += A[i];
    }
    else
    {
        for (int i = 0; i <= pos1; ++i)
        {
            sum += A[i];
        }
        for (int j = n - 1; j >= pos2; --j)
        {
            sum += A[j];
        }
    }
    int temp = MaxSum>sum ? MaxSum : sum;
    if (MaxSum == temp)
    {
        end = pos;
        while (temp != 0)
        {
            temp -= A[pos--];
        }
        start = ++pos;
    }
    else
    {
        if (pos1 >= pos2)
        {
            start = 0;
            end = n - 1;
        }
        else
        {
            end = pos2;
            start = pos1;
        }        
    }
    value = MaxSum>sum ? MaxSum : sum;//比较sum和MaxSum的值
    cout << "最大连续子数列的和:"<<value<<endl;//输出和
    cout << "最大连续子数列:" << start<<"---"<< end<<endl;//输出位置
}
//控制数组的输入引用函数
int main()
{
    int i, n;
    int A[50];
    cout <<"请输入数组的长度:"<< endl;
    cin >> n;
    cout << "请依次输入数组中的数:" << endl;
    for (i = 0; i != n; ++i)
        cin >> A[i];
    FindMaxSum(A, n);

}

 

实验截图:

实验总结:

通过本次实验,进行结对编程,放弃了我第一次程序,因为第一次程序的复杂度比较高,换了一种思路。到目前为止初步对编程有了一点点认识,写代码不仅要可以完成任务 还要可以快速 高效的工作。

posted on 2016-03-26 23:13  信仰2016  阅读(270)  评论(1)    收藏  举报