问题:在标准输入流中,我们从diapason [0,31]得到一组数字序列。每组都以 -1 结束。每组可能为空,数字可以在集合中重复。 你需要找到所有集合的XOR并输出结果的十六进制表示,即我们得到{1,2,3},{3,4},{1,5},结果是{2,4,5},因此十六进制表示为34.结果集中的每个数字对应于32位十六进制表示中的位。
#include <stdio.h>
#include <inttypes.h>
#include <stdint.h>
int main() {
int32_t currentNum;
uint32_t num = 0, result = 0;
while (scanf("%"SCNd32, ¤tNum) == 1) {
if (currentNum != -1) {
num |= 1 << currentNum;
} else {
result ^= num;
num = 0;
}
}
printf("%x\n", result);
return 0;
}
这个问题很简单,我的解决方案就在上面。但我有以下问题:我发送代码的测试系统给我一个运行时错误。我无法想象哪里出错了,我无法想出一个返回运行时错误的测试。 你能给我一些提示吗?
答案 0 :(得分:0)
首先,看起来1 << 31
是未定义的行为。请注意,1
是signed constant,而1 << 31
在int
中无法表示,因此undefined。尝试使用1U << currentNum
使其无符号且定义明确。
其次,SCNd32
可能不是您所期望的。在我的系统上(Windows上的MinGW-w64 GCC 5.3.0),它根本没有定义,所以你的程序不能编译。因此,我可以想象它可以定义为其他东西,然后编译但在运行时失败。在那里尝试一个简单的"%d"
或"%i"
。
第三,可以配置一些在线评委,以便通过在运行时调用它们之后终止来调用某些函数。其中一个函数可能是scanf
,例如,如果法官管理员认为您应该使用fgets
出于某些奇怪的原因,或iostream
如果该语言实际上是C ++。然而,这已经是猜测领域。尝试阅读法官文件,看看是否是这种情况。