软件工程课后作业:返回一个环形整数数组最大子数组的和

一、题目:返回一个整数数组中最大子数组的和。

二、要求:

(1)输入一个整形数组,数组里有正数也有负数。
(2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
(3)如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
(4)同时返回最大子数组的位置。
(5)求所有子数组的和的最大值。
三,设计思路:
           如果把这个环形数组的每个连接处都割开,分别计算一下,求最大子数组的和,在哪个位置切开就是谁的最大子数组,所以我们可以看成是分开的这样一些普通数组的最大子数组的和,问题转换成我们之前的实验,只需要降维之后再用相同方法求得即可。
 
四,项目代码:
#include<iostream>
#include<time.h>
#define n 20
using namespace std;
void main()
{
    int a[n],i,j,w=0,b[n][n],p1=0,p2=0,t,m;
    srand((int)time(0));
    for(i=0;i<n;i++)
    {
        a[i]=-rand()%36+25;
    }
    for(i=0;i<n;i++)
    {
        cout<<a[i]<<endl;
    }
    for(i=0;i<n;i++)
    {
        m=i;
        w=0;
        j=0;
        while(j<=n-1)
        {
            w+=a[m];
            b[i][j]=w;
            m++;
            if(m>n-1)
            {
                m=0;
            }
            j++;
        }
    }
    t=b[0][0];
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(b[i][j]>t)
            {
                t=b[i][j];
                p1=i;
                p2=j;
            }
        }
    }
    cout<<"最大子数组的值为:"<<t<<endl;
    cout<<"最大子数组中元素的位置为:"<<endl;
    i=0;
    while(i<=p2)
    {
        cout<<p1<<"  ";
        p1++;
        if(p1>=n)
        {
            p1=0;
        }
        i++;
    }
        cout<<endl;
}
五:结果截图:

团队照片:

 

 

 

posted on 2018-11-04 23:23  大浪淘沙。  阅读(137)  评论(0编辑  收藏  举报