C 在Windows和Linux上获得不同的答案

C 在Windows和Linux上获得不同的答案,c,C,我正在努力解决这个问题 当我在我的机器上在Windows 7上运行Visual Studio 2013中的代码时,我得到了正确的答案,但在网站上(我很确定他们使用Linux,我肯定这是他们使用gcc 4.9.2、C99标准的编译器),我得到了非常多的答案,特别是第一个测试用例的12588576(而不是13)和1395920336(而不是15)对于第二个测试用例。我猜这和qsort电话有关 #include <stdio.h> #include <string.h> #in

我正在努力解决这个问题 当我在我的机器上在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;
}
#包括
#包括
#包括
内部组件描述(常数无效*a,常数无效*b)
{
int*aPtr=(int*)a;
int*bPtr=(int*)b;
返回*bPtr-*aPtr;
}
int main()
{
我爱你,我的朋友,我;
scanf(“%d%d”、&flowsneed、&numFriends);
getchar();
成本[100];
memset(0,100);
对于(i=0;i
100应该是
sizeof(花卉成本)
。100不能填充整个数组,因为它是以字节为单位的大小

qsort(flowerCosts, 100, sizeof(int), comp_desc);
您可能只想对您填写的条目(
flowersNeeded
)进行排序,而不是对所有100个条目进行排序

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

100应该是
sizeof(花卉成本)
。100不能填充整个数组,因为它是以字节为单位的大小

qsort(flowerCosts, 100, sizeof(int), comp_desc);
您可能只想对您填写的条目(
flowersNeeded
)进行排序,而不是对所有100个条目进行排序


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

这可能与int和/或endianess的大小有关。如果我错了,请纠正我。这可能与int和/或endianess的大小有关。如果我错了,请纠正我。我很好奇为什么这在我的机器上工作,但在网站上失败,有什么想法吗?@reggaeguitar这是未定义的行为,所以任何事情都可能发生。您的Windows编译器可能在未初始化的数组中填充了零或负值,因此它似乎可以工作。我很好奇为什么这在我的机器上可以工作,但在网站上失败,有什么想法吗?@reggaeguitar这是未定义的行为,所以任何事情都可能发生。您的Windows编译器可能在未初始化的数组中填充了零或负值,因此它似乎可以工作。