结对编程返回整数数组中最大的子数组
2018-10-13 20:54 黄瑞波 阅读(205) 评论(0) 编辑 收藏 举报
本次作业为返回整数数组中最大的子数组,应用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;
源代码为:
1 #include<iostream> 2 #include<ctime> 3 using namespace std; 4 int main() 5 { 6 cout<<"数1601-2 20163980 \n黄瑞波"<<endl;; 7 int m,n=0,star=0,end=0; 8 cout<<"1.手动输入数组。\n2.随机生成数组。请选择功能:";//选择自己输入或者随机生成 9 cin>>m; 10 switch(m) 11 { 12 case 1:{ 13 int *p=new int[n];//开辟为n的存储空间 14 cout<<"请输入数组的长度:"; 15 cin>>n; 16 if(n<0) 17 { 18 cout<<"输入的数组长度有误,请重新输入!"<<endl;//判断数据有效性 19 return 0; 20 } 21 cout<<"输入一个"<<n<<"维整型数组:"; 22 //以下算法代码参考与网络。 23 for(int i=0;i<n;i++) 24 { 25 cin>>p[i]; 26 } 27 int sum=p[0]; 28 int max_sum=p[0]; 29 for(int i=1;i<n;i++) 30 { 31 if(sum>0) //是否为正数 32 { 33 sum=sum+p[i]; //是正数,做和。 34 if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum。 35 { 36 max_sum=sum; 37 end=i; 38 } 39 } 40 else 41 { 42 sum=p[i]; //是负数,将第i+1个数的值赋值给和值sum 43 if(sum>max_sum)//并判断是否为最大,是让其赋值给max_sum。 44 { 45 max_sum=sum; 46 star=i; 47 end=i; 48 } 49 } 50 } 51 cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<"个"<<endl; 52 cout<<"最大子数组和为"<<max_sum<<endl; 53 };break; 54 case 2: 55 { 56 int *p=new int[n]; 57 cout<<"请输入数组的长度:"; 58 cin>>n; 59 if(n<0) 60 { 61 cout<<"输入的数组长度有误,请重新输入!"<<endl; 62 return 0; 63 }cout<<"随机数组为:"; 64 for(int i=0;i<n;i++) 65 { 66 p[i]=-rand()%4000+2000; 67 cout<<p[i]<<" "; 68 } 69 cout<<endl; 70 int sum=p[0]; 71 int max_sum=p[0]; 72 for(int i=1;i<n;i++) 73 { 74 if(sum>0) //判断是否为正数 75 { 76 sum=sum+p[i]; //是正数,做和。 77 if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum。 78 { 79 max_sum=sum; 80 end=i; 81 } 82 } 83 else 84 { 85 sum=p[i]; //是负数,将第i+1个数的值赋值给和值sum 86 if(sum>max_sum)//并判断是否为最大,是让其赋值给max_sum。 87 { 88 max_sum=sum; 89 star=i; 90 end=i; 91 } 92 } 93 } 94 cout<<"最大子数组位置为:第"<<star+1<<"个到第"<<end+1<<"个"<<endl; 95 cout<<"最大子数组和为:"<<max_sum<<endl; 96 };break; 97 } 98 return 0; 99 }
运行结果截图为: