这里的目标是从stdin中读取1个数字,然后读取一组数字,然后检查这两个数字是否是双射。如果我理解正确,这意味着第一个数字必须在数字集合中,并且集合中不能有任何重复的数字。
示例输入
3 1 2 3
示例输出
YES
示例输入
5 2 3 4 5 2
示例输出
NO
我的输入
3
1 2 3
我的输出
NO
似乎我的错误来自我检查重复的数组。始终将checkDups
设置为1.这段代码:
for(x=0; x < 20; x++) {
if(n == numbers[x]) checkNums = 1;
for(y=0; y < 20; y++) {
if(x != y && numbers[x] == numbers[y]) {
checkDups = 1;
}
}
}
完整代码
int n;
int numbers[21];
int i = 0;
int x = 0;
int y = 0;
int checkDups = 0;
int checkNums = 0;
scanf("%d", &n);
while(i < 20 && scanf("%d", &numbers[i]) == 1) i++;
for(x=0; x < 20; x++) {
if(n == numbers[x]) checkNums = 1;
for(y=0; y < 20; y++) {
if(x != y && numbers[x] == numbers[y]) {
checkDups = 1;
}
}
}
if(checkNums == 1 && checkDups == 0) printf("YES");
else printf("NO");
答案 0 :(得分:3)
由于存在未初始化的数组(numbers
),因此您无法确定==
的行为。
在C11标准文件中,
指定可能已经存在的自动存储持续时间的对象的左值 宣称与 寄存器 存储类用于需要该值的上下文中 指定对象的,但该对象未初始化。 (6.3.2.1)。
因此numbers[x]
(numbers[y]
)x >= i
(y >= i
)的结果未定义。
请不要使用未初始化的区域(在这种情况下,指数超过i
)
答案 1 :(得分:2)
这个修改过的for
循环对我有用:
for(x=0; x < i; x++) {
if(n == numbers[x])
checkNums = 1;
for(y=x; y < i; y++) {
if(x != y && numbers[x] == numbers[y]) {
checkDups = 1;
}
}
}