标签:
一、实验目的
编写一段代码能够满足求出一个随机给的任意一个数组,并求出其中的最大子数组。
二、要求:
数组里有整数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],……A[n-1],A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n).
三、实验设计思路
1.随机产生一数组,a[i]=rand()%40-rand()%40;//产生负数来生成一个数组中的值。
2.定义一个数组,储存连续字数组和的值。i来储存第一个数,j来储存最后一个数。
3.将字数组的和进行比较,找出最大值,并将下标位置输出。
四、程序源代码
#include<iostream>
#include<time.h>
using namespace std;
#define N 20
void main()
{
int a[N],b[N][N],i,j,s=0,w=0;
srand((int)time(0));//产生随机数
for(i=0;i<N;i++)
a[i]=rand()%40-rand()%40;//产生负数等
for(i=0;i<N;i++)
cout<<a[i]<<" ";//输出数组
for(i=0;i<N;i++)
{
w=0;
for(j=i;j<N;j++)
{
w+=a[j];
b[i][j]=w;
s++;
}
}
int t=0,p1,p2;
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;
}
if(p1==p2)
{
cout<<"最大子数组的和为:"<<t<<endl;
cout<<"其包括的数组元素下标为:"<<p1<<endl;
}
else
{
cout<<"最大子数组的和为:"<<t<<endl;
cout<<"其包括的数组元素下标为:"<<p1<<"~"<<p2<<endl;
}
}
五、截图
六、编程总结(图片形式)
1.
2.
3.
标签:
原文地址:http://www.cnblogs.com/licongzhuo/p/4388571.html