2 qq 39225612 qq_39225612 于 2017.09.19 15:00 提问

这段代码哪里错了?C++ 转 C 测试 20C

这是PTA的一道题,原来的是C++代码,看了之后结合自己的C代码做了修改,但是编译后不能通过全部测试点,是我哪里没考虑到么?希望大神帮忙看看,谢谢!

这是C++代码(AC-code):

 #include <iostream>
/*
* author:Fayne
* time:2015-9-2 21:24:16
*thisSum用于保存临时序列之和,maxSum更新最大序列和
*left, right分别表示最大序列的左右序号,tempLeft保存临时左端的序号
*/
using namespace std;
int A[10010];

int main()
{
    int k, i;
    cin >> k;
    for (i = 0; i<k; i++)
        cin >> A[i];
    int left = 0, right = k - 1, maxSum = -1, thisSum = 0, tempLeft;//maxSum赋初值为-1为了解决出现全部序列为负的情况 
    for (i = 0; i<k; i++)
    {
        thisSum += A[i];

        if (thisSum > maxSum)//如果临时序列和大于最大和,则更新最大和 
        {
            maxSum = thisSum;
            left = tempLeft;//将临时左端的序号赋值给左端序号 
            right = i;
        }
        else if (thisSum < 0)//thisSum小于0时,从此刻下一个开始重新求和 
        {
            thisSum = 0;
            tempLeft = i + 1;//把此刻的下一序号赋值给临时左端序号 
        }
    }
    if (maxSum < 0)//maxSum < 0 说明整个序列全为负数,根据题意,最大和应该为0 
        maxSum = 0;
    cout << maxSum << " " << A[left] << " " << A[right] << endl;

    return 0;
}

这是我写的C代码(基本全错):

 #include<stdio.h>
#include<stdlib.h>

#define LEFT 0
#define RIGHT 1

int MaxSubseqSum4(int A[], int N, int Index[]);

int main()
{
    int K;
    scanf("%d", &K);
    int *A = (int *)malloc((sizeof(int)) * K);
    for (int i = 0; i < K; i++)
        scanf("%d", &A[i]);

    int Index[2] = { 0,K - 1 };
    int Result = MaxSubseqSum4(A, K, Index);

    printf("%d %d %d", Result, Index[LEFT], Index[RIGHT]);

    return 0;
}

int MaxSubseqSum4(int A[], int N, int Index[])
{
    int ThisSum, MaxSum;
    int i;
    int left = 0;
    ThisSum = 0;
    MaxSum = -1;
    for (i = 0; i < N; i++) {
        ThisSum += A[i];
        if (ThisSum > MaxSum) {
            MaxSum = ThisSum;
            Index[LEFT] = left;
            Index[RIGHT] = i;
        }
        else if (ThisSum < 0) {
            ThisSum = 0;
            left = i + 1;
        }
    }
    if (MaxSum < 0)
        MaxSum = 0;

    return MaxSum;
}

5个回答

qq_39225612
qq_39225612   2017.09.19 15:25

这是C++代码:
图片说明
这是我的C代码:
图片说明

qq_39225612
qq_39225612   2017.09.19 15:32
cocos_yang
cocos_yang   2017.09.19 15:37

C代码: for (int i = 0; i < K; i++)除了这个地方int变量i的定义,不能再括号中定义,其它的代码没改,我在CentOS上运行都正常。

lml0703
lml0703   2017.09.20 20:55

有两个问题,楼主有点粗心。
1.C代码在 for循环中不能定义
2.这个错误 楼主怎么会没发现。
题目上要求是输出最大连续子列和的子列 的初始数字和末位数字,而楼主输出的是下标
举个例子,比如输入 k=7 序列为1 2 3 -5 -6 8 1
正确答案应该 输出 9 8 1
楼主的代码输出的是9 5 6 (5 6 为8 1的下标)。
因为在全是负数的时候直接判断为0所以 所以全为负数的时候代码是正确的。
楼主可以先把这里改下应该就可以PASS了,还有问题在提。

lml0703
lml0703   2017.09.20 20:57

楼主你的Index是存的初始和末尾的下标 所以应该输出A[Index[LEFT]]和A[Index[RIGHT]]

Csdn user default icon
上传中...
上传图片
插入图片