c语言程序实现子序列的和,学习笔记——c语言实现最大连续子序列之和的算法...

今天到图书馆借了本数据结构的书,翻开一看,原来这里有我之前参加的周立功机试的题目,哎,真是后悔莫及啊!现在把这个问题好好总结一下,以备不时之需。

最大连续子序列之和问题:给出N个整数(可以为负)A1,A2,A3,…,An,找出i到j项之和的最大值,如果所有整数为负,最大值为0。

下面是给出了三种不同的算法。

//*********************************************************************************************

#include

static int Start = 0;

static int End = 0;

/*

该算法是穷举法,时间复杂度为O(n^3).第一二层循环迭代了所有肯能的连续子序列,第三层循环里tempSum += a[n]就是计算各子序列的和。然后tempSum再与max作比较,求出终结果。Start、End分别记录了子序列的起始和终止位置(数组下标从0开始算)。

*/

int fun(int a[], int n)//n是数组元素的个数

{

int i,j,k,tempSum;

int max = 0;

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

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

{

tempSum = 0;

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

{

tempSum += a[k];

}

if (tempSum > max)

{

max = tempSum;

Start = i;

End = j;

}

}

return max;

}

/*

该算法是基于上一个算法的改进,算法的时间复杂度为O(n^2).在这算法中去掉了上面那个

算法的第二层循环,原因在于,从a[i]加到a[j]的tempSum等于a[i]加到a[j-1]的tempSum

,所以就没必要在来一层循环重新算tempSum了。

*/

int fun2(int a[], int n)

{

int i,j,tempSum;

int max = 0;

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

{

tempSum = 0;

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

{

tempSum += a[j];

if (tempSum > max)

{

max = tempSum;

//Start = i;

//End = j;

}

}

}

return max;

}

/*

该算法是线性算法。我们在计算最大连续子窜的时候会发现一个规律:a[i]至a[j]之和sum

若小于零,那么a[j]后面的项再与sum相加的和一定小于没有加上sum之前的和大。根据这个我们可以设计出如下算法。

*/

int fun3(int a[], int n)

{

int i,j;

int max = 0;

int tempSum = 0;

for (i = 0,j = 0; j < n; j++)

{

tempSum += a[j];

if (tempSum > max)

{

max = tempSum;

//Start = i;

//End = j;

}

else if (tempSum < 0)//若tempSum小于0,下次直接从第j+1项开始加

{

i = j + 1;

tempSum = 0;

}

}

return max;

}

int main()

{

int a[10] = {1,-2,4,6,-2,4,-6,8,-2,-4};

printf("start:%d,end:%d,sum:%d/n", Start,End,fun(a,10));

printf("fun2: sum = %d/n", fun2(a,10));

printf("fun3: sum = %d/n", fun3(a,10));

return 0;

}

//*******************************************************************************************

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言程序设计是计算机专业中必修的一门课程,其包括一个完备的编程语言,使得学生可以进行程序设计和开发。考研C语言程序设计的难度与之前学习的课程有很大的不同,需要对程序设计有一定的经验和技巧。因此,在学习C语言程序设计时,需要有一定的笔记和总结。 首先,在学习C语言程序设计时,需要掌握语言的基础,包括基础语法、数据类型、运算符和控制语句等。在学习这些基础知识的同时,需要通过实践来掌握C语言的编写规范和习惯。 其次,在此基础上,需要掌握常见的数据结构和算法,在程序设计中灵活应用。这些涉及到的数据结构包括栈、队列、链表和二叉树等,这些结构在实际开发中十分常见,并且能够解决很多实际问题。算法方面,需要熟练掌握搜索、排序、动态规划等基本算法,并结合具体问题进行实践练习。 另外,学习C语言的过程中,需要掌握调试技巧,在程序出现问题时,能够进行快速定位并解决问题。调试技巧包括打断点、输出调试信息等,在程序测试和代码修改中起到了至关重要的作用。 总的来说,学习C语言程序设计需要扎实的基础知识和实践经验,以及良好的编程习惯,这些需要不断的积累和实践。在考研C语言程序设计时,需要注意考试重点和难点,进行有针对性的复习和练习。通过不断的学习和总结,相信可以在C语言程序设计方面取得不错的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值