标签:int inf sig length width 整数 ctime 生成 技术分享
设计思想
遍历数组的时候将数组中第一个数变成最后一个数,这样就得到了好几个新的数组,然后输出每个数组的最大子数组的和,在比较每个输出结果,找到最大的子数组和。
代码
#include <iostream>
#include<ctime>
#define Num 10000
using namespace std;
int DTGH_Sum(int a[],int n)
{
int sum = 0;
int *b = (int *) malloc(n * sizeof(int));
b[0] = a[0];
for(int i = 1; i < n; i++)
{
if(b[i-1] > 0)
b[i] = b[i - 1] + a[i];
else
b[i] = a[i];
}
for(int j = 0; j < n; j++)
{
if(b[j] > sum)
sum = b[j];
}
delete []b;
return sum;
}
int main()
{ int temp,b;
int sum=0;
int i;
int a1,a2;
int a[Num];
int length=0;
while (length==NULL||length == 0)
{
cout<<"请输入数组长度:";
cin>>length;
}
cout<<"生成随机序列: "<<endl;
srand((unsigned)time(NULL));
for(i=0;i<length;i++)
{
if(rand()%2==0)
{
a[i]=rand()%100;
}
else
{
a[i]=(-1)*rand()%100;
}
cout<<a[i]<<" ";
}
cout<<endl;
cout<<"此首尾相连的数组中最大子数组的和有以下几种可能:"<<endl;
cout<<"第1种排列方式:"<<endl;
for( i=0;i<length;i++)
{
cout<<a[i]<<" ";
}
cout<<"最大子数组和为:"<<DTGH_Sum(a,length)<<endl;
a1=DTGH_Sum(a,length);
for(b=1;b<length;b++)
{
temp=a[0];
for(i=1;i<=length;i++)
{
a[i-1]=a[i];
}
a[length-1]=temp;
cout<<"第"<<b+1<<"种排列方式:"<<endl;
for( i=0;i<length;i++)
{
cout<<a[i]<<" ";
}
cout<<"最大子数组和为:"<<DTGH_Sum(a,length)<<endl;
if(DTGH_Sum(a,length)>=sum)
{
sum=DTGH_Sum(a,length);
}
}
a2=sum;
cout<<endl;
if(a1>=a2)
{
cout<<"综上,最大的子数组和为:"<<a1<<endl;
}
else
{
cout<<"综上,最大的子数组和为:"<<a2<<endl;
}
return 0;
}
运行效果

合照

标签:int inf sig length width 整数 ctime 生成 技术分享
原文地址:https://www.cnblogs.com/mashijie605023237/p/9904551.html