问题:在标准输入流上,我们从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;
}
这个问题很简单,我的解决方案在上面。但是我有以下问题:在其中发送代码的测试系统会返回运行时错误。我无法想象哪里出错了,也无法提出返回运行时错误的测试。
你能给我一些提示吗?
最佳答案
首先,看起来1 << 31
是未定义的行为。请参见,1
是signed constant,1 << 31
在int
中不能表示,因此undefined。在此处尝试1U << currentNum
使其无符号且定义明确。
其次,SCNd32
可能不是您所期望的。在我的系统(Windows上的MinGW-w64 GCC 5.3.0)上,它根本没有定义,因此您的程序无法编译。因此,我可以想象它也可以定义为其他含义,然后编译但在运行时失败。在那里尝试简单的"%d"
或"%i"
。
第三,可以配置一些在线判断器,以便在运行时调用某些函数后终止调用,以限制某些函数的调用。例如,如果法官管理员认为出于某些奇怪的原因而应使用scanf
,则此类功能之一可能是fgets
;如果实际上是C ++,则可能是iostream
。然而,这已经是猜测的领域。尝试阅读法官文档,看是否是这种情况。