作业要求:
1.程序必须能处理1000个元素;
2.每个元素是int32类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;
3.输入一个整形数组,数组里面既有正数也有负数;
4.数组中连续的一个或多个整数组成一个字数组,每个子数组都有一个和;
5.求所有子数组的和的最大值,要求时间复杂度为O(n)。
设计思路:
1.首先定义数组个数,然后选择是否使用随机数组
2.随机数组则是利用srand(time(null))和rand同时作用来生成元素个数为n的随机数组并使用%限定返回使这1000个数都在10000到-10000范围内
3.从第一个数开始做加法,若和大于第二个数,则继续加下一个数(若加上第三个数的和大于第三个数则重复进行此操作;小于第三个数,则舍掉前面的所有数,并继续重复进行此操作);若小于第二个数,则舍掉第一个数。
4.取数的时候使用了远大于存储范围的数10个1000000000来观察(int32能表示的范围就是2的32次方,表示为数值是-2^(32-1) ~ 2^(32-1) -1)
出现的问题:
1.一开始不太了解C++出现了好多错误
2.发现了好多不太会的c++语句,还有很多没考虑到的情况
#include <iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{
int i,c;
int n;
int a[1000];
int max = 0;
int b = 0;
cout << "输入数组元素个数";
cin >> n;
cout << "是否使用随机数组:1.是 2.不是 3.观察数据溢出";
cin >> c;
if (c == 1)
{
srand(time(NULL));
for (i = 0; i < n; i++)
{
a[i] = (rand() % 20000 - 10000);
}
}
if (c == 2)
{
for (i = 0; i < n; i++)
{
cin>>a[i];
}
}
if (c == 3)
{
for (i = 0; i < 10; i++)
{
a[i]=1000000000;
}
}
cout << "数组为:" << endl;
for (i = 0; i<n; i++)
{
cout << a[i] << ' ';
}
cout << endl;
{
int i,c;
int n;
int a[1000];
int max = 0;
int b = 0;
cout << "输入数组元素个数";
cin >> n;
cout << "是否使用随机数组:1.是 2.不是 3.观察数据溢出";
cin >> c;
if (c == 1)
{
srand(time(NULL));
for (i = 0; i < n; i++)
{
a[i] = (rand() % 20000 - 10000);
}
}
if (c == 2)
{
for (i = 0; i < n; i++)
{
cin>>a[i];
}
}
if (c == 3)
{
for (i = 0; i < 10; i++)
{
a[i]=1000000000;
}
}
cout << "数组为:" << endl;
for (i = 0; i<n; i++)
{
cout << a[i] << ' ';
}
cout << endl;
for (i = 0; i < n; i++)
{
b += a[i];
if (b < 0)
b = 0;
if (b > max)
max = b;
}
if (max == 0)
{
max = a[0];
for (i = 0; i < n; i++)
{
if (max < a[i])
{
max = a[i];
}
}
}
cout << "最大子数组为:" << max << endl;
system("pause");
return 0;
}
{
b += a[i];
if (b < 0)
b = 0;
if (b > max)
max = b;
}
if (max == 0)
{
max = a[0];
for (i = 0; i < n; i++)
{
if (max < a[i])
{
max = a[i];
}
}
}
cout << "最大子数组为:" << max << endl;
system("pause");
return 0;
}
![](https://img2018.cnblogs.com/blog/1500005/201810/1500005-20181014173013481-2142298658.png)
数据溢出
![](https://img2018.cnblogs.com/blog/1500005/201810/1500005-20181014173350778-762278633.png)
总结:这次编程发现了好多自身存在的问题,比如说编程语言的生疏和情况考虑的不周全,而且一开始也不是很明白int32的范围大小,产生了理解上的错误使得一开始观察数据溢出出现了问题。这次编程很好的提高了我自己。
![](https://img2018.cnblogs.com/blog/1500005/201810/1500005-20181014173800599-1881206892.png)