我试图从输入中查找不等于 0 的不同数字的数量。n 在 1-100 范围内。数组中的数字范围为 0-600。 http://codeforces.com/problemset/problem/937/A 针对这个问题,我写了一段代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
int n, count = 0, i;
scanf("%d", &n);
int ar[n], ar2[601];
memset(ar2, 0, 600 * sizeof(int));
for (i = 0; i < n; i++) {
scanf("%d ", &ar[i]);
if (ar2[ar[i]] == 0)
ar2[ar[i]] = 1;
}
for (i = 1; i < 601; i++) {
if (ar2[i] != 0)
count++;
}
printf("%d",count);
return 0;
}
对于第一个测试用例 (4 1 3 3 2),它在 ideone.com 的 gcc 6.3 中输出正确答案 3,但在 codeforces 使用的 gcc 5.1 中输出正确答案 4。
为什么会发生这种情况,如何防止这种情况发生? (我认为这是因为 memset,但我不确定。)
最佳答案
您正在定义一个大小为 n
的数组在 n
的值之前已确定(请注意,您 scanf
之后的 n
的值)。这是未定义的行为,因此不同的编译器可能会给出不同的结果,甚至在您的计算机上启动程序也可能会给出不同的结果(包括崩溃)。
而不是
int n, count = 0, i;
int ar[n];
...
写
int n, count = 0, i;
scanf("%d", &n);
int ar[n], ar2[601] = { 0 };
至少应该解决格式错误的数组,并且 ar2
完全初始化为 0
。您可以摆脱您的memset
,无论如何,它只初始化了 600 个项目(而不是 601 个)。
关于计算除 0 以外的不同数字 (C) 在不同编译器中输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49414874/