课堂作业第四周
求整数组中子数组和的最大值
思路:用随机数产生固定的个数为n,其中有负有正,for循环循环N次,默认最大子数组和为零,从a[0]开始使数组的每一个相加为k,再判断K是否大于最大子数组和Maxsum,大于是另maxsum=k;最后在判断k是否大于零,若小于零则让k=0;
时间记录表
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3/20 | 10:10 | 12:00 | 10分钟 | 2小时 | 听课 | |
19:30 | 21:00 | 1个半小时 | 进行初步编写规划 | 看PPt | ||
3/21 | 9:00 | 11:00 | 30分钟 | 1个半小时 | 用普通的方法编写程序 | 不满足o(n)的时间复杂度 |
3/22 | 10:00 | 11:00 | 1个小时 | 编写满足o(n)时间复杂度的程序 | ||
16:00 | 17:00 | 1个小时 | 继续上午的编写 | |||
3/23 | 10:00 | 11:00 | 1个小时 | 写文档,做总结 | ||
缺陷记录表
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3/20 | 1 | 40 | 设计 | 编译 | 1分钟 | 数组定义错误 |
描述:定义数组的个数较少 | ||||||
2 | 20 | 编码 | 编译 | 1分钟 | ||
描述 | :缺少分号 | |||||
3/21 | 3 | 40 | 编码 | 编译 | 2分钟 | |
描述:缺少Cmath的头文件 | ||||||
4 | 40 | 编码 | 编译 | 2分钟 |
描述:pow(x,y)函数中x必须为double类型 | ||||||
5 | 40 | 编码 | 编译 | 2分钟 | ||
描述:使随机数产生负数 | ||||||
3/22 | 6 | 20 | 编码 | 编译 | 1分钟 | |
描述:漏掉 } | ||||||
7 | 40 | 描述:逻辑出现错误 |
周活动总结表
日起/任务 | 听课 | 编写程序 | 阅读课本 | 运动 | 日总结 | ||
周五(3.20) | 4小时 | 2小时 | 1小时 | 7小时 | |||
周六(3.21) | 2小时 | 1小时 | 2小时 | 5小时 | |||
周日(3.22) | 1小时 | 2小时 | 1小时 | 4小时 | |||
周一(3.23) | 4小时 | 1小时 | 5小时 | ||||
周二(3.24) | 8小时 | 1小时 | 9小时 | ||||
周三(3.25) | 2小时 | 2小时 | 1小时 | 1小时 | 5小时 | ||
周四(3.26) | 6小时 | 1小时 | 1小时 | 8小时 |
代码
#include<iostream>
#include<cmath>
using namespace std;
void main()
{
int a[100],i,j,f,n;
int MaxSum = 0;
int k = 0;
cout<<"请输入数组中数字的个数"<<endl;
cin>>n;
for(i=0;i<n;i++)
{
j=rand()%2+1;
f=pow(-1.0,j);
a[i]=f*rand()%10;
}
cout<<"数组为"<<endl;
for(i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
cout<<"最大子数组为";
for(i=0;i<n;i++)
{
k += a[i];
if(k > MaxSum)
MaxSum = k;
if(k < 0)
k = 0;
}
cout<<MaxSum<<endl;
}
截图
总结:
该题最重要的是不容易满足时间复杂度o(n)这一要求,解题时可以先用普通方法一步一步的写出程序,然后在此基础上考虑哪些地方的条件可以改动,能合并就合并,进行简化,最后时期满足时间复杂度为o(n);