课堂练习2 返回一个整数数组中最大子数组的和。
Posted guoshaozhou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了课堂练习2 返回一个整数数组中最大子数组的和。相关的知识,希望对你有一定的参考价值。
1.要求程序必须能处理1000个元素;
2.每个元素是int32类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;
3.输入一个整形数组,数组里面既有正数也有负数;
4.数组中连续的一个或多个整数组成一个字数组,每个子数组都有一个和;
5.求所有子数组的和的最大值,要求时间复杂度为O(n)。
设计思想:
1.随即生成数组(含有正数和负数)。
2:求所有子数组,按数组长度进行数组的划分。 计算:从第一个数开始做加法,若和大于第二个数,则继续加下一个数(若加上第三个数的和大于第三个数则重复进行此操作;小于第三个数,则舍掉前面的所有数,并继续重复进行此操作);若小于第二个数,则舍掉第一个数。
出现的问题:
1.在生成随机数的时候,正负数没有一起生成。
2.当出现子数组之和大于整型表示的最大范围会出现溢出情况,运行结果都为零
3.软件没有妥当保存导致中途代码糗事,稍微影响了完成进度。
程序源代码:
2.每个元素是int32类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;
3.输入一个整形数组,数组里面既有正数也有负数;
4.数组中连续的一个或多个整数组成一个字数组,每个子数组都有一个和;
5.求所有子数组的和的最大值,要求时间复杂度为O(n)。
设计思想:
1.随即生成数组(含有正数和负数)。
2:求所有子数组,按数组长度进行数组的划分。 计算:从第一个数开始做加法,若和大于第二个数,则继续加下一个数(若加上第三个数的和大于第三个数则重复进行此操作;小于第三个数,则舍掉前面的所有数,并继续重复进行此操作);若小于第二个数,则舍掉第一个数。
出现的问题:
1.在生成随机数的时候,正负数没有一起生成。
2.当出现子数组之和大于整型表示的最大范围会出现溢出情况,运行结果都为零
3.软件没有妥当保存导致中途代码糗事,稍微影响了完成进度。
程序源代码:
#include<iostream>
#include<time.h>
#include<conio.h>
#define N 1000
using namespace std;
void RandIn(int IntNum,int A[]) //随机生成数组
{
cout<<"整数内容"<<endl;
for(int i=0;i<IntNum;i++)
{
A[i]=rand()-rand();
cout<<A[i];
if(i%20==4)
cout<<endl;
else
cout<<‘ ‘;
}
}
void SelMax(int IntNum,int A[],int &sum)
{
auto buffer=0;
int count1=0; //求和的数值个数
int count2=0;
for(int j=0;j<=IntNum;j++)
{
if(j==IntNum)
{
j=0;
}
buffer+=A[j];
count1++;
count2++;
if(buffer<0)
{
buffer=0;
count1=0;
}
if(sum<buffer)//sum始终记录下存在的最大和
{
sum=buffer;
}
{
break;
}
}
}
void main()
{
int IntNum;
int A[N];
int q=0;
while(q==0)
{
auto sum=0;
srand((unsigned)time(NULL));
cout<<"请输入数组元素的个数:";
cin>>IntNum;
RandIn(IntNum,A);
SelMax(IntNum,A,sum);
cout<<endl;
cout<<sum<<endl;
cout<<"是否继续测试(输入0则继续否则停止)";
cin>>q;
system("cls");
}
}
运行结果:
#include<time.h>
#include<conio.h>
#define N 1000
using namespace std;
void RandIn(int IntNum,int A[]) //随机生成数组
{
cout<<"整数内容"<<endl;
for(int i=0;i<IntNum;i++)
{
A[i]=rand()-rand();
cout<<A[i];
if(i%20==4)
cout<<endl;
else
cout<<‘ ‘;
}
}
void SelMax(int IntNum,int A[],int &sum)
{
auto buffer=0;
int count1=0; //求和的数值个数
int count2=0;
for(int j=0;j<=IntNum;j++)
{
if(j==IntNum)
{
j=0;
}
buffer+=A[j];
count1++;
count2++;
if(buffer<0)
{
buffer=0;
count1=0;
}
if(sum<buffer)//sum始终记录下存在的最大和
{
sum=buffer;
}
{
break;
}
}
}
void main()
{
int IntNum;
int A[N];
int q=0;
while(q==0)
{
auto sum=0;
srand((unsigned)time(NULL));
cout<<"请输入数组元素的个数:";
cin>>IntNum;
RandIn(IntNum,A);
SelMax(IntNum,A,sum);
cout<<endl;
cout<<sum<<endl;
cout<<"是否继续测试(输入0则继续否则停止)";
cin>>q;
system("cls");
}
}
运行结果:
当出现子数组之和大于整型表示的最大范围时会出现溢出现象,运行结果都为零:
心得: 团结就是力量,相比于个人项目,团体协作的优势十分明显,但编程能力方面还是太弱这是硬伤,需要借助网络资源帮助,经过此次编程使得我俩的部分计算机语言运用的更加熟练,理解更加透彻,以后要多加练习,更加熟练。
以上是关于课堂练习2 返回一个整数数组中最大子数组的和。的主要内容,如果未能解决你的问题,请参考以下文章