代码

时间:2017-01-07 02:00:14

标签: c algorithm

问题:在标准输入流中,我们从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, &currentNum) == 1) {
        if (currentNum != -1) {
            num |= 1 << currentNum;
        } else {
            result ^= num;
            num = 0;
        }
    }
    printf("%x\n", result);
    return 0;
}

这个问题很简单,我的解决方案就在上面。但我有以下问题:我发送代码的测试系统给我一个运行时错误。我无法想象哪里出错了,我无法想出一个返回运行时错误的测试。 你能给我一些提示吗?

1 个答案:

答案 0 :(得分:0)

首先,看起来1 << 31是未定义的行为。请注意,1signed constant,而1 << 31int中无法表示,因此undefined。尝试使用1U << currentNum使其无符号且定义明确。

其次,SCNd32可能不是您所期望的。在我的系统上(Windows上的MinGW-w64 GCC 5.3.0),它根本没有定义,所以你的程序不能编译。因此,我可以想象它可以定义为其他东西,然后编译但在运行时失败。在那里尝试一个简单的"%d""%i"

第三,可以配置一些在线评委,以便通过在运行时调用它们之后终止来调用某些函数。其中一个函数可能是scanf,例如,如果法官管理员认为您应该使用fgets出于某些奇怪的原因,或iostream如果该语言实际上是C ++。然而,这已经是猜测领域。尝试阅读法官文件,看看是否是这种情况。