zoukankan      html  css  js  c++  java
  • 数组中子数组之和最大值(首尾相接)

    题目:求一维子数组的最大子数组之和(一维数组首尾相接)并写出子数组

    人员

      陈晨:程序复查,结果测试。  

      王颖瑞:编写代码

    思路

    1.求最大子数组之和:对于首尾相接的数组来说,如果计算子数组之和,最多把数组循环两遍,所以我们把数组的长度扩大了一倍(如果要算的数组是5位,那么数组就定义为10位,前半部分和后半部分一样),之后把这个数组进行分组(以要算的数组为5为例)。第一个数到第五个数为一组,第二个数与第六个数为一组...第五个数到第九个数。分别把各组的子数组的最大值记录到另一个数组中。比较求出最大的子数组之和。

    2.列出最大子数组:由于知道最大值在第二个数组的位置,所以输出那个位置上的原数组的值,之后依次输出后面数组的值,直到他们的和等于最大值。

    代码: 

    #include<iostream>
    using namespace std;
    
    void main()
    {
    	int n,i,a[100],x=0,b=0,sum,B[100],max,j,m,y;  
    	cout<<"输入数组的位数";
    	cin>>n;
    	cout<<"输入"<<n<<"个数";
    	for(i=0;i<n;i++)
    	{
    		cin>>a[i];
    		a[n+i]=a[i];
    	}
    
    	while(x<n)
    	{
    		sum=a[x];
    		for(i=x;i<n+x;i++)
    		{
    			if(b<0)
    				b=a[i];  
    			else 
    			{
    				b+=a[i];
    
    			}
    			if(sum<b)  
    			{
    				sum=b;
    				m=i;
    
    			}
    		}
    		B[x]=sum;
    		x=x+1;
    		b=0;
    
    	}
    
    	max=B[0];
    	for(i=1;i<n;i++)
    	{
    		
    		if(B[i]>max&&a[i]>0)
    		{
    			max=B[i];
    			j=i;
    
    		}
    		
    
    	}
    
    
    	cout<<max<<" "<<"从第"<<j+1<<"个数开始"<<endl;
    
    	//输出字数组。
    	y=a[j];
    	m=j;
    	for(i=j+1;i<j+n;i++)
    	{
    		if(y==max)break;
    		else
    		{
    			y=y+a[i];
    			m=m+1;
    		}
    	}
    
    	for(i=j;i<=m;i++)
    	{
    		cout<<a[i]<<" ";
    	}
    }
    

     截图:

    总结:

    通过这次试验,使我们之间的配合更加默契,我们之间更加了解,同时,我也发现了自身的不足,如不重视编码规范,变量名称随意等。

    我相信在以后的合作中,我会发现自己更多的不足并加以改正,是自己的编程水平有所提高。

  • 相关阅读:
    prometheus告警触发流程
    Mac 生成keystory文件
    web 登陆页面订做
    Gitlab 备份、恢复、平级迁移
    Gitlab 7.14.3 rpm 安装
    Mysql 启动方式
    Nginx 日志打印十六进制 x16x03x01x02x00x01x00x01xFCx03x03PxBB
    MacVim not work with perl 5.28
    Python 字符串前加u,r,b的含义
    免费 SSL 证书 certbot 配置
  • 原文地址:https://www.cnblogs.com/double1/p/4421679.html
Copyright © 2011-2022 走看看