//注:本小队有三人,分别为王友军,黄瑞玻,白宇乾;因本班级人数为奇数,故如此
本次作业为返回整数数组中最大的子数组,应用c++编写,在visual c++ 2010 平台执行。
在编写过程中学会以下知识:
- 应用 int n;int *p=new int[n];开辟动态储存空间。满足输入动态数组的要求。
- 应用switch语句实现程序功能的多元化。
- 使用如下代码判断最大子数组之和。 for(int i=0;i<n;i++)
{
cin>>p[i];
}
int sum=p[0];
int max_sum=p[0];
for(int i=1;i<n;i++)
{
if(sum>0) //是否为正数
{
sum=sum+p[i]; //是正数,做和。
if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum。
{
max_sum=sum;
end=i;
}
}
else
{
sum=p[i]; //是负数,将第i+1个数的值赋值给和值sum
if(sum>max_sum)//并判断是否为最大,是让其赋值给max_sum。
{
max_sum=sum;
star=i;
end=i;
}
}
}
cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<"个"<<endl;
cout<<"最大子数组和为"<<max_sum<<endl; - 应用p[i]=rand()输入随机数组。如果不再加任何条件时数组元素范围为零到32767 (2^16-1),其计算原理为:y=ax+b(mod n)其中,n一般是一个很大的素数,几万。
a也是大素数。而且a,b,n都是常数。所以rand的产生决定于x,
他被称为seed。
每一个seed都是上一次产生的y的函数。这样,如果直接取seed=y的话,
虽然产生的rand之间相关性甚小,但只要知道某个y,就能推知以后的rand。
为避免这种情况,一般取seed为y和当时计算机的时间的函数,如seed=y+t
比如VC中对于rand()函数是如下实现的.
int __cdecl rand (void)
{
return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
} - 如果想用rand函数输出负数时,可以这样应用:p[i]=-rand()%4000+2000;
#include<iostream> #include<ctime> using namespace std; int main() { cout<<"数1601-2 20163980 黄瑞波"<<endl;; int m,n=0,star=0,end=0; cout<<"1.手动输入数组。 2.随机生成数组。请选择功能:";//选择自己输入或者随机生成 cin>>m; switch(m) { case 1:{ int *p=new int[n];//开辟为n的存储空间 cout<<"请输入数组的长度:"; cin>>n; if(n<0) { cout<<"输入的数组长度有误,请重新输入!"<<endl;//判断数据有效性 return 0; } cout<<"输入一个"<<n<<"维整型数组:"; //以下算法代码参考与网络。 for(int i=0;i<n;i++) { cin>>p[i]; } int sum=p[0]; int max_sum=p[0]; for(int i=1;i<n;i++) { if(sum>0) //是否为正数 { sum=sum+p[i]; //是正数,做和。 if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum。 { max_sum=sum; end=i; } } else { sum=p[i]; //是负数,将第i+1个数的值赋值给和值sum if(sum>max_sum)//并判断是否为最大,是让其赋值给max_sum。 { max_sum=sum; star=i; end=i; } } } cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<"个"<<endl; cout<<"最大子数组和为"<<max_sum<<endl; };break; case 2: { int *p=new int[n]; cout<<"请输入数组的长度:"; cin>>n; if(n<0) { cout<<"输入的数组长度有误,请重新输入!"<<endl; return 0; }cout<<"随机数组为:"; for(int i=0;i<n;i++) { p[i]=-rand()%4000+2000; cout<<p[i]<<" "; } cout<<endl; int sum=p[0]; int max_sum=p[0]; for(int i=1;i<n;i++) { if(sum>0) //判断是否为正数 { sum=sum+p[i]; //是正数,做和。 if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum。 { max_sum=sum; end=i; } } else { sum=p[i]; //是负数,将第i+1个数的值赋值给和值sum if(sum>max_sum)//并判断是否为最大,是让其赋值给max_sum。 { max_sum=sum; star=i; end=i; } } } cout<<"最大子数组位置为:第"<<star+1<<"个到第"<<end+1<<"个"<<endl; cout<<"最大子数组和为:"<<max_sum<<endl; };break; } return 0; }
运行结果截图为: