1.设计思想
首先将随机生成的数存入一个数组中,然后计算每个子数组的和,定义一个二维数组记录和,该二维数组第一行表示一个数的行,第二行为相邻两个数相加的和的行,以此类推将所有的和存入,并将所有子数组的和进行输出。找出最大的子数组的和记录它的坐标及m和n,将最大数组的和输出,并对该和所对应的子数组中的数进行输出。
2.源程序
#include <iostream>
using namespace std;
#define N 20
void main()
{
int a[N],b[N][N]={0},k=0;
cout<<"生成的数组为:";
for(int i=0;i<N;i++) //生成数组里的随机数
{
a[i]=rand()%100-50;
cout<<a[i]<<" ";
}
cout<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N-i;j++)
{
int k=1,m=j;
while(k<=i+1)
{
b[i][j]+=a[m];
m++;
k++;
}
}
}
cout<<"各子数组的和分别为:";
for(int i=0;i<N;i++)
{
for(int j=0;j<N-i;j++)
{
cout<<b[i][j]<<" ";
}
}
cout<<endl;
int m=0,n=0;
for(int i=0;i<N;i++)
{
for(int j=0;j<N-i;j++)
{
if(b[i][j]>b[m][n])
{
m=i;
n=j;
}
}
}
cout<<"最大的和为:"<<b[m][n]<<endl;
cout<<"最大子数组中的数为:";
for(int i=n;i<=n+m;i++)
cout<<a[i]<<" ";
cout<<endl;
}
3.结果截图
4.总结
开始的时候有一个思想,但是想了很久发现比较难实现,后来又琢磨了很久最终实现,在这个过程中对于将每个子数组的和存在二维数组中遇到了难题,还有就是子数组的输出过程中。以后想问题还是要思路清晰,认真思考,也尽可能的在纸上进行演算让自己的思维更明白些。
5.
(1)
活动 |
上课 |
编写代码 |
看书 |
休息娱乐 |
总计 |
周一 |
300 |
|
|
|
300 |
周二 |
400 |
|
|
|
400 |
周三 |
100 |
|
|
|
100 |
周四 |
400 |
|
|
|
400 |
周五 |
200 |
30 |
|
300 |
530 |
周六 |
|
60 |
|
300 |
360 |
周日 |
|
120 |
60 |
200 |
380 |
总计 |
1400 |
310 |
60 |
800 |
2570 |
(2)
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
21/3 |
22:00 |
23:00 |
22:40 |
40 |
找思路 |
有一点想法 |
22/3 |
14:00 |
14:40 |
|
40 |
找思路 |
用二维数组存储和 |
|
21:50 |
23:00 |
|
70 |
编程 |
但是在二维数组求和那卡住了 |
23/3 |
10:30 |
12:30 |
|
120 |
编程 |
数组求和做出来,但是子数组输出有点不会 |
|
16:00 |
17:30 |
|
90 |
编程、测试 |
解决了问题,测试成功 |
(3)
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
22/3 |
1 |
二维数组定义 |
编码 |
编译 |
45 |
自己在纸上举例子进行了最后的完善定义 |
22/3 |
2 |
循环混乱 |
编码 |
编译 |
120 |
经过思考进行改进 |