zoukankan      html  css  js  c++  java
  • 返回一个循环数组中最大子数组的和

    设计思路

    首先利用rand()函数随机产生一个一维数组,数组长度通过宏定义来控制。求首尾连接的一维数组的最大子数组的和我的思路是:循环N次(N是数组的长度)依次检测数组的最大子数组的和再比较大小,保留最大值。例如长度为5的数组a[0],a[1],a[2],a[3],a[4],第一轮循环从a[0]到a[4],循环内部求出该数组的最大子数组;第二轮循环从a[1]到a[0],求出此时的最大子数组的和与第一轮的最大值比较,保留大者。依次循环N次最后就可以返回循环数组中最大子数组的和。最后把结果合理的打印出来即可(要注意负数的打印方法)。

    源程序代码

    #include <iostream>

    #include <cstdlib>

    #include <ctime>

    using namespace std;

    #define NUM 20

     

    void main()

    {

         int a[NUM],aa[NUM],b,c,d=0,i,j,l,k,m,t=-1000,o=-1000,x,y;

         cout<<"请输入数值范围:"<<endl;

         cin>>b>>c;

         cout<<"生成数组为:"<<endl;

         srand(unsigned(time(0)));

         for (i=0;i<NUM;i++)

         {

             a[i]=rand()%(c-b+1)+b;

             cout<<a[i]<<" ";

         }

         for (l=0;l<NUM;l++)

         {

             for (m=0;m<NUM;m++)

             {

                  if (m+l<NUM)

                  {

                       aa[m]=a[l+m];

                  }

                  else

                       aa[m]=a[l+m-NUM];

             }

         for (i=0;i<NUM;i++)

         {

             for (j=i;j<NUM;j++)

             {

                  d=0;

                  for (k=i;k<=j;k++)

                  {

                       d=d+aa[k];

                  }

                  if (d>t) {t=d;x=l+i;y=l+j;}

             }

             if (t>o) o=t;

         }

         }

         cout<<endl<<"最大子数组的和:"<<endl;

         if (y<NUM)

         {

             for (i=x;i<=y;i++)

             {

                  if (a[i]>=0)

                  {

                       cout<<a[i];

                  }

                  else cout<<"("<<a[i]<<")";

                  if (i!=y) cout<<"+";

                  else cout<<"=";

             }

             cout<<o<<endl;

         }

         else

         {

             y=y-NUM;

             for (i=x;i<NUM;i++)

             {

                  if (a[i]>=0)

                  {

                       cout<<a[i];

                  }

                  else

                  {

                       cout<<"("<<a[i]<<")";

                  }

                  cout<<"+";

             }

     

             for (i=0;i<=y;i++)

             {

                  if (a[i]>=0)

                  {

                       cout<<a[i];

                  }

                  else

                  {

                       cout<<"("<<a[i]<<")";

                  }

                  if (i!=y)

                  {

                       cout<<"+";

                  }

                  else

                  {

                       cout<<"=";

                  }

             }

             cout<<o<<endl;

         }

    }

    运行结果截图

    该截图显示了最大子数组跨越连接点时的情况,正确输出了最大子数组的和。

    编程总结

    起初看到这个题目觉得有一定难度,因为脑子里没有一个清晰的解决思路。经过一段时间的思考,我想到了用上述方法来解决这个问题,在原来编程的基础上我添加了一个循环,另外做了一些修改完成了这个题目。通过此次编程过程,我意识到了解决任何问题首先要有明确的思路,没有思路就像无头苍蝇,没有思路就不要敲键盘,在有了明确的思路后编程将变得事半功倍。另外要善于在原来的编程基础上做修改来满足新问题,这就避免了重新写一些重复的代码,减少了时间成本。

  • 相关阅读:
    什么是Servlet?
    哪种情况下用哪种域对象
    相对于Statement,PreparedStatement的优点是什么?
    JDBC的PreparedStatement是什么?
    execute,executeQuery,executeUpdate的区别是什么?
    什么是JDBC,在上面时候会用到它?
    ArrayList、LinkedList、Vector 的区别。
    int 和 Integer 有什么区别
    Java 为每个原始类型提供了哪些包装类型
    什么是JDBC,在上面时候会用到它?
  • 原文地址:https://www.cnblogs.com/BUANG/p/4428324.html
Copyright © 2011-2022 走看看