1. 程式人生 > >返回一個整數組中最大子數組的和程序設計

返回一個整數組中最大子數組的和程序設計

namespace 理解 範圍 inf int32 數組元素 很多 技術 自身

作業要求:

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; 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] << ‘\t‘;
}
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; }技術分享圖片

技術分享圖片

技術分享圖片

總結:這次編程發現了好多自身存在的問題,比如說編程語言的生疏和情況考慮的不周全,而且一開始也不是很明白int32的範圍大小,產生了理解上的錯誤使得一開始觀察數據溢出出現了問題。這次編程很好的提高了我自己。

返回一個整數組中最大子數組的和程序設計