在Windows与Linux上获得不同的答案

reg*_*tar 0 c

我正在尝试解决这个问题https://www.hackerrank.com/challenges/flowers 当我在我的机器上的Windows 7上的Visual Studio 2013中运行我的代码时,我得到了正确的答案,但在网站上(我很漂亮)确定他们使用Linux而且我很肯定这是他们使用gcc 4.9.2,C99标准的编译器)我得到非常大的答案数,特别是第一个测试用例的12588576(而不是13)和1395920336(而不是15)对于第二个测试用例.我猜这与qsort调用有关.

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

int comp_desc(const void * a, const void * b)
{
    int * aPtr = (int*)a;
    int * bPtr = (int*)b;
    return *bPtr - *aPtr;
}

int main()
{
    int flowersNeeded, numFriends, i;
    scanf("%d %d", &flowersNeeded, &numFriends);
    getchar();
    int flowerCosts[100];
    memset(flowerCosts, 0, 100);
    for (i = 0; i < flowersNeeded; ++i)
    {
        scanf("%d", &flowerCosts[i]);
    }
    qsort(flowerCosts, 100, sizeof(int), comp_desc);
    int flowersBought = 0;
    int moneySpent = 0;
    int multiplier = 1;
    for (i = 0; i < flowersNeeded; ++i)
    {
        moneySpent += flowerCosts[i] * multiplier;
        multiplier = (++flowersBought / numFriends) + 1;
    }
    printf("%d\n", moneySpent);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

int*_*jay 5

memset(flowerCosts, 0, 100);
Run Code Online (Sandbox Code Playgroud)

100应该是sizeof(flowerCosts).100不会填满整个数组,因为它是以字节为单位的大小.

qsort(flowerCosts, 100, sizeof(int), comp_desc);
Run Code Online (Sandbox Code Playgroud)

您可能只想对您填写的条目(flowersNeeded)而不是所有100 个条目进行排序.

由于这两个错误,您将在数组的未初始化部分中对垃圾值进行排序.

  • @reggaeguitar它是未定义的行为,所以任何事情都可能发生.您的Windows编译器可能使用零或负值填充未初始化的数组,因此它似乎有效. (2认同)