1. 程式人生 > >課堂練習三

課堂練習三

void image std n) 存在 oid 正數 思想 設計

題目:返回一個整數數組中最大子數組的和。
要求:

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

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

3)如果數組A[0]……A[j-1]首尾相鄰,允許A[i-1],…… A[n-1],A[0]……A[j-1]之和最大

設計思想:這是第三次的課堂練習,相比較上一次的多了第三條,數組收尾相連,即把數組變成了環狀的,就像上學期數據結構的循環列表,從環狀的任意位置剪開,就出現每次遍歷時首元素和尾元素不一樣,從而求出的最大組數組的和也不一樣,因此需要進一步比較各個數組,即把每一種起點不同的情況下的最大子數組求出並保存,然後再比較,這裏就存在了多重比較。

#include<iostream>
#include<time.h>
#define n 10
using namespace std;

void main()
{
int a[n],c,d,w=0,b[n][n],p1=0,p2=0,t,m;


srand((int)time(0));
for(c=0;c<n;c++)
{
a[c]=-rand()%36+25;
}
for(c=0;c<n;c++)
{
cout<<a[c]<<endl;
}
for(c=0;c<n;c++)
{
m=c;
w=0;
d=0;
while(d<=n-1)
{
w+=a[m];
b[c][d]=w;
m++;
if(m>n-1)
{
m=0;
}
d++;
}
}

t=b[0][0];
for(c=0;c<n;c++)
{
for(d=0;d<n;d++)
{
if(b[c][d]>t)
{
t=b[c][d];
p1=c;
p2=d;
}
}
}

cout<<"最大子數組的值為:"<<t<<endl;
cout<<"子數組中元素的下標為:"<<endl;

c=0;

while(c<=p2)
{
cout<<p1<<" ";
p1++;
if(p1>=n)
{
p1=0;
}
c++;
}

cout<<endl;
} 技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

課堂練習三