MOOC浙大数据结构(陈,何)课后作业
未通过代码(但是在本地编译器上可以得到正确结果,我也不知为啥):
#include <stdio.h>
#define N 10005
int* MaxSubseqSum2 ( int a[], int n);
int* MaxSubseqSum2 ( int a[], int n){ //稍微简单点的办法,二重循环,O(N^2)
int ThisSum, MaxSum = -1;
int head,end;
int *p = NULL;
int b[3];
for ( int i = 0; i < n; i++ ) {
ThisSum = 0;
for ( int j = i; j < n; j++ ) {
ThisSum += a[j];
if ( ThisSum > MaxSum ){
MaxSum = ThisSum;
head = a[i];
end = a[j];
}
}
}
b[0] = MaxSum;
b[1] = head;
b[2] = end;
p = b;
return p;
}
int main(){
int a[N]={0}, K;
int *p = NULL;
int b[3];
scanf("%d", &K);
for ( int i = 0; i < K; i++ ) {
scanf("%d", &a[i]);
}
p = MaxSubseqSum2(a,K);
if (p[0]<0){
printf( "%d %d %d",0,a[0],a[K-1]);
}
else{
printf( "%d %d %d",p[0],p[1],p[2]);
}
return 0;
}
写的时候犯了一个错误,p = MaxSubseqSum2(a,K,b),写函数的时候没有把数组b作为参数,这导致了函数MaxSubseqSum2没有改变主函数中定义的数组b(因为数组b在函数中作为一个局部变量而非全局变量,函数执行结束后局部变量b消失)。
但是奇怪的是,我用本地的编译器就可以正常输出结果,提交的时候必须将数组b当做参数传入。
(估计也没说清楚还是不太懂其实)
PS:数组传入函数不需要通过引用传入也可以更改数组的值。参考C++中数组作函数参数的问题
更改了这个问题后,答案通过的代码:
#include <stdio.h>
#define N 10005
int* MaxSubseqSum2 ( int a[], int n ,int b[]);
int* MaxSubseqSum2 ( int a[], int n ,int b[]){ //稍微简单点的办法,二重循环,O(N^2)
int ThisSum, MaxSum = -1;
int head,end;
int *p = NULL;
for ( int i = 0; i < n; i++ ) {
ThisSum = 0;
for ( int j = i; j < n; j++ ) {
ThisSum += a[j];
if ( ThisSum > MaxSum ){
MaxSum = ThisSum;
head = a[i];
end = a[j];
}
}
}
b[0] = MaxSum;
b[1] = head;
b[2] = end;
p = b;
return p;
}
int main(){
int a[N]={0}, K;
int *p = NULL;
int b[3];
scanf("%d", &K);
for ( int i = 0; i < K; i++ ) {
scanf("%d", &a[i]);
}
p = MaxSubseqSum2(a,K,b);
if (p[0]<0){
printf( "%d %d %d",0,a[0],a[K-1]);
}
else{
printf( "%d %d %d",p[0],p[1],p[2]);
}
return 0;
}
主要问题还是使用函数修改主函数中变量值 的问题吧。