数组题目小计(4)
小伙伴博客链接:http://www.cnblogs.com/ly199553/p/5322647.html
照例:
工作照
由于本次难度相对较易,所以没有采取分组形式,进行迭代开发时会选取较为方便的一个
在上次的基础上,又增加了求首尾相连的子数组最大和的功能,主要思路是将除了原数组最后一个元素外的数字复制到原数组后的空间,然后从第一个元素到最后一个元素依次当起始元素,找出最大值依次存入一个数组,求出数组的最大值即为原可首尾相连数组的最大值,例如:10 -10 5 -1 将10 -10 5 复制至后面得10 -10 5 -1 10 -10 5,然后规定起始元素依次为10 -10 5 -1,数组长度为4
代码如下:
1 #include<iostream> 2 using namespace std; 3 int Max(int i, int a[100], int num); 4 int Max_num(int i, int a[100], int num, int b[100]); 5 int main() 6 { 7 cout << "请输入数组元素个数:"; 8 int num; 9 cin >> num; 10 cout << "请输入数组:"; 11 int array[100],i; 12 for (i = 0; i < num;i++) 13 cin >> array[i]; 14 int max = array[0]; 15 int m[100];//存放最大值的数组 16 int sum = 0;//存放累加和 17 //复制除最后元素的一个数组放到数组后的空间 18 for (int k = 0; k < num; k++) 19 { 20 array[k + num] = array[k]; 21 } 22 //最大值大于0 23 for (i = 0; i < num; i++)//设定起始元素 24 { 25 sum = 0; 26 for (int q = i; q < i + num; q++)//以起始元素为头的规定元素数的数组 27 { 28 sum = sum + array[q]; 29 if (sum > max) 30 max = sum; 31 if (sum < 0) 32 sum = 0; 33 if (max == 0) 34 { 35 sum = sum + array[q]; 36 if (sum > max) 37 max = sum; 38 } 39 m[i] = max; 40 } 41 } 42 cout << "子数组最大的和为:"<<Max(i, m, num)<<endl; 43 cout << "最大子数组的起始元素为第"; 44 cout<< Max_num(i, m, num, array); 45 cout << "个元素"<< endl; 46 } 47 //求最大值数组中的最大值 48 int Max(int i, int a[100], int num) 49 { 50 int max = a[0]; 51 for (i = 0; i < num ; i++) 52 { 53 if (a[i] > max) 54 max = a[i]; 55 } 56 return max; 57 } 58 59 //返回最大子数组和起始元素位置 60 int Max_num(int i, int a[100], int num,int b[100]) 61 { 62 int max = a[0], m_num=0; 63 for (i = 0; i < num; i++) 64 { 65 if (a[i] > max) 66 { 67 max = a[i]; 68 m_num = i; 69 if (b[m_num] < 0)//如果起始元素为负数,则向后移一个 70 m_num = m_num + 1; 71 } 72 } 73 return m_num+1;//使从0开始到从1开始 74 }
测试结果: