今天写的这个英文题其实就很简单,注意下标怎么求就行。但是在编程的过程中出现了一些语法错误。首先比如说,分号没加,分号没有打好(中文)这种尴尬的错误。如果有个正常的IDE的话会好一点。
然后scanf输入的用法自己还是没有弄得很清楚。
malloc今天被坑了一下。malloc的默认返回时void*,这样的话编译器其实是会根据情况帮我们选择返回的指针类型,但是今天做一个强制的int*的类型转换的时候报错了,这里留个坑,当时的报错信息是warning: implicitly declaring library function 'malloc' with type 'void *(un.....。
然后重点花时间有两个错误,一个是非常幼稚的if(A=B)错误,在一个if语句里用了一个=符号,导致输出的结果一直是自己在赋值。
然后另外自己一直卡的地方是,没有审清楚题意。题目要求的是,输出具体的开始和结束的数字,我以为是输出小标。以后出现问题,怀疑算法之前,还是要检查下语法错误以及与题目的契合度。
最后,自己的算法漏掉了一种情况。就是有零存在且其他数字为负数的时候,这个时候不仅要输出0,还要输出0的数字。如何解决这个问题呢,只要将开始的子列和的数字定义为负数就行,也就是把输出0的情况当成一种情况,与全部输入都是负数的情况区分开来。这个想法应该是和网上的许多代码不一样的。代码贴一下:
#include"stdio.h"
void MaxSubSequence(int A[], int K)
{
int number = 0;
int maxsequence = -1;
int maxleft = 0;
int maxright = 0;
int sequenceleft = 0;
int i;
for (i = 0; i < K; i++)
{
number = number + A[i];
if (number > maxsequence)
{
maxsequence = number;
maxright = i;
maxleft = sequenceleft;
}
if (number < 0)
{
number = 0;
sequenceleft = i + 1;
}
}
if (maxsequence == -1)
{
printf("%d %d %d", 0, A[0], A[K - 1]);
}
else
{
printf("%d %d %d", maxsequence, A[maxleft], A[maxright]);
}
}
int main()
{
int K;
int i;
scanf("%d", &K);
int *A = (int*)malloc(sizeof(int)*K);
for (i = 0; i < K; i++)
{
scanf("%d", &A[i]);
}
MaxSubSequence(A, K);
return 0;
}
这次编程经历体现了编程要细心要审题,要考虑到多样的情况。也就是说测试样例是必须的。