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

返回一個整數數組中最大子數組的和。

掌握 info srand 最大 include 調用 處理 必須 求和

要求

程序必須能處理1000個元素;

每個元素是int32類型的,出現子數組之和大於整型表示的最大範圍會出現什麽情況;

輸入一個整形數組,數組裏有正數也有負數。

數組中連續的一個或多個整數組成一個子數組, 每個子數組都有一個和。

求所有子數組的和的最大值。要求時間復雜度為O(n)。

編程思路

要求能處理1000個元素,就可隨機生成IntNum個正負數,使IntNum 大於1000,引入一個常量記錄累加的和buffer,用cont1計算vuffer進行求和的數值個數,cont2計算for語句進行的運算次數,如果累加和小於0,buffer重新初始化為0,sum始終記錄下存在的最大和,計算子數組的和的最大值。

編程代碼

#include<iostream>

#include<time.h>

#include<conio.h>

#define N 100000

using namespace std;

void RandIn(int IntNum,int A[])

{

cout<<"整數內容"<<endl;

for(int i=0;i<IntNum;i++)

{

A[i]=rand()-rand();

cout<<A[i];

if(i%5==4)

cout<<endl;

else

cout<<‘\t‘;

}

}

void SelMax(int IntNum,int A[],auto &sum)

{

auto buffer=0;

int count1=0;

int count2=0;

for(int j=0;j<=IntNum;j++)

{

if(j==IntNum)

{

j=0;

}

buffer+=A[j];

count1++;

count2++;

if(buffer<0)

{

buffer=0;

count1=0;

}

if(sum<buffer)

{

sum=buffer;

}

if(count1>IntNum||count2>IntNum*2)

{

break;

}

}

}

void main()

{

int IntNum;

int A[N];

int q=0;

while(q==0)

{

auto sum=0;

srand((unsigned)time(NULL));

cout<<"請輸入整數的個數:";

cin>>IntNum;

RandIn(IntNum,A);

SelMax(IntNum,A,sum);

cout<<endl;

cout<<sum<<endl;

cout<<"是否繼續測試(輸入0則繼續否則停止)";

cin>>q;

system("cls");

}

}

運行截圖

技術分享圖片

技術分享圖片

實驗心得

本次對數組程序的編寫,加深了我對數組的認識,掌握了隨機rand的使用方法,運用了調用函數,為我對今後的編程提供了幫助。

結對照片

技術分享圖片

返回一個整數數組中最大子數組的和。