返回一個整數數組中最大子數組的和。
要求
程序必須能處理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的使用方法,運用了調用函數,為我對今後的編程提供了幫助。
結對照片
返回一個整數數組中最大子數組的和。