1. 程式人生 > >結對專案3

結對專案3

題目:返回一個整數陣列中最大子陣列的和。
要求:
輸入一個整形陣列,數組裡有正數也有負數。
陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。
如果陣列A[0]……A[j-1]首尾相鄰,允許A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同時返回最大子陣列的位置。 求所有子陣列的和的最大值。
設計思想:
1.確定一個數組a[n]
2.先用雙重迴圈,求出子陣列的和
第一次以陣列的第一個元素為字陣列的第一個元素,依次往下加,直到陣列最後一個元素
第二次以陣列的第二個元素為字陣列的第一個元素,再依次往下加,原來陣列的第一個元素設定為最後一個元素(PS:利用不超過原陣列長度實現)
以此類推,直到原陣列最後一個元素。形成迴圈陣列
3.用一個二維陣列b[][]存放每個子陣列的和
4.再利用雙重迴圈比較陣列b中元素的大小得到原陣列a的最大子陣列和以及元素下標

出現的問題:如果超過十個數,程式不再記錄第十個元素之後的數
解決方案: 在源程式中修改n值或者不再手動輸入直接自動生成陣列
srand((int)time(0));
for(i=0;i<n;i++)
{
a[i]=-rand()%36+25;
}
原始碼:
#include<iostream>
#include<time.h>
#define n 10
using namespace std;

void main()
{
int a[n],i,j,w=0,b[n][n],p1=0,p2=0,t,m;
cout<<"請輸入10個整數:\n";
for(i = 0; i < 10; i++)//輸入
{
cin>>a[i];
}

//輸出陣列的元素值
for(i=0;i<n;i++)
{
cout<<a[i]<<endl;
}
//求子陣列和
for(i=0;i<n;i++)
{
m=i;
w=0;
j=0;
while(j<=n-1)
{
w+=a[m];
b[i][j]=w;
m++;
if(m>n-1)
{
m=0;
}

j++;
}
}

t=b[0][0];
//比較子陣列和大小
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(b[i][j]>t)
{
t=b[i][j];
p1=i;
p2=j;
}
}
}

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

i=0;

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

cout<<endl;
}

結果截圖

 

 

總結:

實現一個目的時,先拆分為小的可以實現的目標

思考一個目的的實現,找到他的關鍵是什麼,邊練習邊學習。遇到不會的時候要能儘自己的努力查詢資料,理解資料轉化為自己的東西