zoukankan      html  css  js  c++  java
  • 课堂练习四: 返回一个整数数组中最大子数组的和。

    讨论过程(设计思想)
    1.1数据分组n组
    1.2将分组后前n-1个数组求和,然后第n组求和,排除不能整除的可能输出
    1.3将n组数组的和进行比较大小,将最大值输出

    源代码

    #include<iostream>
    #include<time.h>
    using namespace std;
    void RandIn(int IntNum,int A[])
    {
    	int IntCont;
    	cout<<"整数内容"<<endl;
    	for(int i=0;i<IntNum;i++)
    	{
    		IntCont=-(int)rand()%201+100;
    		A[i]=IntCont;
    		cout<<A[i];
    		if(i%5==4)
    			cout<<endl;
    		else
    			cout<<'	';
    	}
    }
    void DivANum(int IntNum,int SubANum,int sum[],int A[])
    {
    	int i,max;
        int	ArrayNum=0;
    	for(i=0;i<IntNum-SubANum;i+=SubANum)
    	{
    		sum[ArrayNum]=0;
    		for(int j=i;j<i+SubANum;j++)
    		{
    			sum[ArrayNum]+=A[j];
    		}
    		cout<<sum[ArrayNum];
    		if(ArrayNum%5==4)
    		cout<<endl;
    		else
    			cout<<'	';
    		ArrayNum++;
    	}
    	sum[ArrayNum]=0;
    	for(int j=i;j<IntNum;j++)
    	{
    		sum[ArrayNum]+=A[j];
    	}
    	cout<<sum[ArrayNum];
    	cout<<endl;
    
    	max=sum[0];
    	for(i=0;i<=ArrayNum;i++)
    	{
    		if(max<sum[i])
    		{
    			max=sum[i];
    		}
    	}
    	cout<<"max="<<max<<endl;
    }
    void main()
    {
    	srand((unsigned)time(NULL));
    	int A[10000],IntNum,SubANum,sum[10000],p=1;
    	while(p==1)
    	{
    		cout<<"请输入整数的个数:";
    		cin>>IntNum;
    		RandIn(IntNum,A);
    		cout<<endl;
    		cout<<"请输入划分组成员个数";
    		cin>>SubANum;
    		DivANum(IntNum,SubANum,sum,A);
    		cout<<"是否继续测试(输入1则继续否则退出)";
    		cin>>p;
    	}
    }
    

    程序截图

    团队照片

    试验总结

    结对编程能够找出更多的bug,加快了程序的进度和准确性,通过本次实验我受益良多,对团队合作有了更深的认识

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    程序更改

    改前说明

    在此附上题目

    题目:返回一个整数数组中最大子数组的和。
    要求:
    输入一个整形数组,数组里有正数也有负数。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。

    由于没有看题目只是听老师说要分组,就以为只要划分分组求最值就可以了,就过出现了这样一个很令人尴尬的程序

    在此附上最新的解题思路,至于可取度有待考量

    设计思想

    由于要求o(n)的复杂度且只要求求出最大和,所以采用两个变量来记录求和sum和buffer,buffer对连续的数进行求和,和大于0则继续累加,但将过程中每一次的和与sum比较,sum初始化为0,用sum记录最大的和,当buffer出现负数时抛弃此时的buffer和,buffer置零,继续对buffer求和,下一个数如果还是负数,buffer再次得到负数,继续抛弃,重置,直到将数组遍历一遍为止

    源代码

    #include<iostream>
    #include<time.h>
    #include<conio.h>
    #define N 1000
    using namespace std;
    void RandIn(int IntNum,int A[])
    {
    	cout<<"整数内容"<<endl;
    	for(int i=0;i<IntNum;i++)
    	{
    		A[i]=-(int)rand()%201+100;
    		cout<<A[i];
    		if(i%5==4)
    			cout<<endl;
    		else
    			cout<<'	';
    	}
    }
    void SelMax(int IntNum,int A[],	int &sum)
    {
    	int buffer=0;//引入一个常量记录累加的和
    	for(int j=0;j<IntNum;j++)
    	{
    		buffer+=A[j];
    		if(buffer<0)//如果累加和小于0,buffer重新初始化为0
    		{
    			buffer=0;
    		}
    		if(sum<buffer)//sum始终记录下存在的最大和
    		{
    			sum=buffer;
    		}
    	}
    }
    void main()
    {
    	
    	int IntNum;
    	int A[N];
    	int q=0;
    	while(q==0)
    	{
    		int sum=0;
    		srand((unsigned)time(NULL));
    		cout<<"请输入整数的个数:";
    		cin>>IntNum;
    		RandIn(IntNum,A);
    		SelMax(IntNum,A,sum);
    		cout<<endl;
    		cout<<sum<<endl;
    		cout<<"是否继续测试(输入0则继续否则停止)";
    		cin>>q;
    		system("cls");
    	}
    }
    

     截图

    实验总结

    严谨的设计思想才是好程序的灵魂,与之相比,编写程序相形见绌。

  • 相关阅读:
    vscode安装设置go
    Go开发环境搭建
    使用Docker镜像
    Docker for mac安装
    封装request.get_params批量取值
    Python之日志处理(logging模块)
    Python3 urllib.parse 常用函数示例
    前端之CSS属性相关
    前端之CSS选择器
    前端之CSS介绍
  • 原文地址:https://www.cnblogs.com/tianma-0/p/4350085.html
Copyright © 2011-2022 走看看