博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
循环数组的子数组最大和
阅读量:4485 次
发布时间:2019-06-08

本文共 1671 字,大约阅读时间需要 5 分钟。

一。实验要求

1.输入一个整型数组,数组里有正数也有负数,数组中一个或多个整数组成一个整数组,每个子数组都有一个和。

2.数组可以首位相连,允许A【i-1】,....,A[n-2],A[0]........A[j-1]和最大

3.返回最大子数组的位置,求最大子数组的和.

二、实验思路

循环数组,也就是最后一个数组值和第一个数组值相连,整个子数组可以从任何一个整数开始遍历求出所有的子数组,参考前面数组的设计思想,有二种可能的解决方案。

1.对数组内的每一个数都进行遍历,然后遍历以他们为起点,长度最大为数组长度的所有子数组,比较各个子数组的大小,求出最大子数组的和。

2.从头开始遍历,遍历到数组A【i】时,最大子数组的值可能是max+A【i】,也可能为A【i】,做出比较,取最大值.

我们选择了第一种解决方案,遍历所有的子数组求出最大值,因为是循环数组,所以从每一个数开始遍历其最长子数组的长度都是数组的长度,所以我们将数组通过if循环,赋值给长度为数组长度2n-1的新数组,设施遍历长度为n,遍历出所有子数组,求出最大值.

三。实验人员:

袁凤隆  杨子浩

四。实验源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
int
main()
{
    
int
i,d,m,a,h,l,p;
    
int
max=0;
    
int
b=0;
    
int
c [10];
    
int
n [19];
    
srand(time(NULL));
    
for
(i=0;i<10;i++)
    
{
        
d=rand()%2;
        
if
(d==0)
        
{
            
c[i]=rand()%10;
        
}
        
else
        
{
            
c[i]=-rand()%10;
        
}
 
        
printf(
"%d  "
,c[i]);
    
}
    
printf(
"\n  "
);
    
for
(m=0;m<19;m++)
    
{
        
if
(m<10)
        
{
            
n [m]=c [m];
        
}
        
else
        
{
            
n [m]=c [m-10];
        
}
        
printf(
"%d  "
,n[m]);
    
}
    
for
(m=0;m<10;m++)
    
{
        
for
(i=m;i<(10+m);i++)
        
{
            
for
(a=i;a<(10+i);a++)
            
{
                
d=0;
                
for
(h=i;h<=a;h++)
                
{
                    
d+=n[h];
                    
if
(d>max)
                    
{
                    
max=d;
                    
l=i;
                    
p=a;
                    
}
                
}
            
}
        
}
    
}
        
if
(max==0)
        
{
            
max=c[0];
            
for
(i=0;i<10;i++)
            
{
                
if
(max<c[i])
                
{
                    
max=c[i];
                    
l=p=i;
                
}
            
}
        
}
     
    
if
(max>2147483647)
        
printf(
"piease atart again\n"
);
    
printf(
"\n"
);
    
printf(
"maximum array is=%d\n"
,max);
    
printf(
"最大子数组为\n"
);
    
for
(i=l;i<=p;i++)
    
{
        
printf(
"  %d   "
,n[i]);
    
}
    
return
0;
}

 五。实验结果图片

六。实验总结。

  通过本次实验深刻的理解实验思路和将问题降维的重要性,将数组重新存储是想通过两个循环实现,最后发现一个if语句就可以实现,真的是太重要,期待下次实验

转载于:https://www.cnblogs.com/yzhztoutlook/p/9904640.html

你可能感兴趣的文章
异步编程的处理
查看>>
浅谈程序员该具备的自我修养
查看>>
第九章笔记 openssh-server
查看>>
map以及iterator迭代器
查看>>
[经典算法]约瑟夫问题
查看>>
【Linus】Linus常用命令总结
查看>>
静态成员变量
查看>>
Mac IDEA快捷键积累
查看>>
Ubuntu install 错误 E:Unable to locate package
查看>>
数据库索引的优缺点分析
查看>>
H.264 SODB RBSP EBSP的区别
查看>>
iOS裁剪,缩放图片白边问题解决办法
查看>>
CMD Markdown basic & Math Cheatsheet
查看>>
中国剩余定理
查看>>
高性能 CSS3 动画
查看>>
列出zip文件内全部内容 当前目录下的所有文件压缩成zip格式的文件(file.zip)
查看>>
centos 7 五笔安装
查看>>
[转]js获得session
查看>>
模糊查询和聚合函数
查看>>
弱网测试总结
查看>>