首尾相连的一位数组最大子数组和

题目:在原有的一位数组上进行扩展,求首尾相连的最大子数组的和:

 

要求: 输入一个一维整形数组,数组里有正数也有负数。

         数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

         求所有子数组的和的最大值。

结对编程要求: 两人结对完成编程任务。 一人主要负责程序分析,代码编程。

                    一人负责代码复审和代码测试计划。

                   发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。

结对开发过程:

    这次的编程开发是基于上次的以为数组,我和我的搭档@快乐的小菜鸟开始了认真的讨论,再结合课堂上的同学讨论,如何能在一维数组原有的基础上,加上首尾相连这个条件,同时降低时间复杂度,这种方法的大概思想是:遍历数组里面的每一个数将第一个数变为最后一个数,具体算法 a[i-1]=a[i],这样又变成了一个新的一维数组,输出每个数组的最大子数组和,然后比较每个输出的和,找出最大的数:

 

具体代码:

#include <iostream.h>  
  
int maxSum(int* a, int n)  //定义一个求一维数组的最大子数组和的方法
{  
    int sum=0;  
       
    int b=0;  
    
    for(int i=0; i<n; i++)  
    {  
        if(b<0)           
            b=a[i];  
        else  
            b+=a[i];  
        if(sum<b)  
            sum=b;  
    }  
    return sum;  
}  
  
int main()  
{   int n,temp,b;
    int  sum=0;
	int i;
	int a1,a2;
    cout<<"请输入数组的元素个数: "<<endl;
    cin>>n;
    cout<<"请输入数组的元素: "<<endl;
	int *a=new int[n];
	
    for( i=0;i<n;i++)
	{cin>>a[i];}
	cout<<"此首尾相连的数组中最大子数组的和有以下几种可能:"<<endl;
	cout<<"第1种排列方式:"<<endl;
    for( i=0;i<n;i++)
	{cout<<a[i]<<"  ";}
	cout<<"最大子数组和为:"<<maxSum(a,n)<<endl;
	a1=maxSum(a,n);
    for(b=1;b<n;b++)
	{
		temp=a[0];
	for(i=1;i<=n;i++)
	 {  
        a[i-1]=a[i];
			
	 }
	   a[n-1]=temp;
	   cout<<"第"<<b+1<<"种排列方式:"<<endl;
       for( i=0;i<n;i++)
	   {cout<<a[i]<<"  ";}
	   cout<<"最大子数组和为:"<<maxSum(a,n)<<endl;
	   if(maxSum(a,n)>=sum)
	   {sum=maxSum(a,n);}
	} 
	  a2=sum;
	  cout<<endl;
	  if(a1>=a2)
	  {cout<<"综上,最大的子数组和为:"<<a1<<endl;}
	  else
	  {cout<<"综上,最大的子数组和为:"<<a2<<endl;}
    
    return 0;  
} 

  

截图:

 

 

实验感想:

   这次感觉题目算是比较简单,想通了其中的关键算法核心,就是a[i-1]=a[i],只不过算法复杂度可能不符合老师的要求!

 

结对伙伴截图:

转载于:https://www.cnblogs.com/TSbj/p/4378707.html

以下是代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Node { int data; struct Node *next; } Node, *LinkList; void printList(LinkList head) { // 打印链表 Node *p = head->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } void destroyList(LinkList head) { // 销毁链表 Node *p = head; while (p != NULL) { Node *temp = p; p = p->next; free(temp); } } LinkList createListFromFile(const char *filename) { // 从文件中读取整数创建链表 FILE *fp = fopen(filename, "r"); if (fp == NULL) { printf("Failed to open file %s.\n", filename); return NULL; } LinkList head = (Node *)malloc(sizeof(Node)); head->next = NULL; Node *tail = head; int num; while (fscanf(fp, "%d", &num) != EOF) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = num; newNode->next = NULL; tail->next = newNode; tail = newNode; } fclose(fp); return head; } void sortList(LinkList head) { // 排序链表 Node *p = head->next; head->next = NULL; while (p != NULL) { Node *q = p->next; Node *prev = head; while (prev->next != NULL && prev->next->data < p->data) { prev = prev->next; } p->next = prev->next; prev->next = p; p = q; } } int insert_L(LinkList head, int x) { // 将x插入链表,返回插入位置 Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = x; newNode->next = NULL; Node *p = head->next; int position = 0; while (p != NULL && p->data < x) { position++; p = p->next; } newNode->next = p; head->next = newNode; return position + 1; } void endToEnd(LinkList head, char *s) { // 将链表中的数字首尾相连组合成字符串 Node *p = head->next; int len = 0; while (p != NULL) { sprintf(s + len, "%d", p->data); len += strlen(s + len); p = p->next; } int i = 0, j = len - 1; while (i < j) { char temp = s[i]; s[i] = s[j]; s[j] = temp; i++; j--; } } void split(char *s, int a[]) { // 拆分字符串 a[0] = strlen(s); for (int i = 1; i <= a[0]; i++) { a[i] = s[a[0] - i] - '0'; } } void saveListToFile(LinkList head, const char *filename) { // 将链表中的数字存入文件 FILE *fp = fopen(filename, "w"); if (fp == NULL) { printf("Failed to open file %s.\n", filename); return; } Node *p = head->next; while (p != NULL) { fprintf(fp, "%d ", p->data); p = p->next; } fclose(fp); } int main() { LinkList head = createListFromFile("aa.dat"); if (head == NULL) { return 0; } printList(head); sortList(head); printList(head); int position = insert_L(head, 5); printList(head); printf("Insert position: %d\n", position); char s[100]; endToEnd(head, s); printf("String: %s\n", s); int a[100]; split(s, a); printf("Array:"); for (int i = 1; i <= a[0]; i++) { printf(" %d", a[i]); } printf("\n"); saveListToFile(head, "bb.dat"); destroyList(head); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值