zoukankan      html  css  js  c++  java
  • 一组数组中最大子数组之和

    思路:

    1、随机输入数组

    2、求出数组之和a

    3、用a与数组第一个数开始做和。如果数字小于a,那么舍弃该数;如果大于a,继续计算a与第一个数与第二个数之和,如果小于a舍弃这两个数,如果大于a,继续计算a与第一个数、第二个数、第三个数之和......直到计算的最后一个数为止。

    4、与第3步步骤类似,只是从最后一个数开始计算,到第一个数为止。

    5、求出最大子数组,输出该字数组数字,以及之和。

    源代码:

      1 //XiaoSong Du 2015/3/22
      2 #include <iostream>
      3 #include <time.h>
      4 using namespace std;
      5 #define N 10
      6 
      7 int a[N] ,b,b1,d,d1 = 0,jj = 0,k1 = 0;
      8 int maxd = 0,maxd1 = 0 ,end1 = 0,end2=0;
      9 void zheng(int& j,int k)
     10 {
     11     d = 0;
     12     for (int i = j;i <= k;i++)
     13     {
     14         d += a[i];
     15         if (d >= maxd)
     16         {
     17             maxd = d;
     18             end1 = i;
     19         }
     20         if (b - d >= b)
     21         {
     22             b = b - d; 
     23             j++;
     24             j = j + jj;
     25             d = 0;
     26             jj = 0;
     27         }
     28         else {
     29             jj++;
     30         }
     31     }
     32 }
     33 void ni(int j,int &k )
     34 {
     35     d1 = 0;
     36     for (int i = k;i >= j;i--)
     37     {
     38         d1 += a[i];
     39         if (d1 >= maxd1)
     40         {
     41             maxd1 = d1;
     42             end2 = i;
     43         }
     44         if (b1 - d1 >= b1)
     45         {
     46             b1 = b1 - d1; 
     47             k--;
     48             k = k - k1;
     49             d1 = 0;
     50             k1 = 0;
     51         }
     52         else{
     53             k1++;            
     54         }    
     55     }
     56 }
     57 void main()
     58 {
     59     int d = 0,d1 = 0;
     60     int j = 0,k = N-1;
     61     srand((unsigned int)time(0));
     62     for (int i = 0;i < 10;i++)
     63     {
     64         a[i] = rand()%50 - 25;
     65         cout << a[i] << " ";
     66         b += a[i];    
     67     }    
     68     b1 = b;
     69     cout << endl;
     70     
     71     //去掉开头结尾的负数
     72     for (int i = 0;i < N;i++)
     73     {
     74         if (a[i] < 0)
     75             j++;
     76         else
     77             break;
     78     }
     79     for (int i = 0;i < N;i++)
     80     {
     81         if (a[N-1-i] < 0)
     82             k--;
     83         else
     84             break;
     85     }
     86 
     87     int x = j,y = k;
     88     zheng(j,k);
     89     ni(x,y);
     90     for (int i = j;i <= y;i++)
     91         b += a[i];
     92     
     93     if (maxd > b)
     94     {
     95         cout << "子数组为:";
     96         for (int i = end2;i <= end1;i++)
     97             cout << a[i] << " ";
     98         cout << endl;
     99         cout << "和为: " << maxd << endl;
    100     }
    101     else
    102     {
    103         cout << "子数组为:";
    104         for (int i = j;i <= y;i++)
    105             cout << a[i] << " ";
    106         cout << endl;
    107         cout << "和为: " << b << endl;
    108     }    
    109 }

    运行结果截图:

  • 相关阅读:
    Swift
    Swift
    书籍
    Swift
    Swift
    iOS系统架构
    Reveal真机(越狱)查看任意APP
    Swift
    Swift
    Swift
  • 原文地址:https://www.cnblogs.com/zrdm/p/4353350.html
Copyright © 2011-2022 走看看