从stdin读取并比较C中的数字

时间:2016-07-12 03:35:38

标签: c arrays

这里的目标是从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");

2 个答案:

答案 0 :(得分:3)

由于存在未初始化的数组(numbers),因此您无法确定==的行为。

在C11标准文件中,

  

指定可能已经存在的自动存储持续时间的对象的左值   宣称与   寄存器   存储类用于需要该值的上下文中   指定对象的,但该对象未初始化。 (6.3.2.1)。

因此numbers[x]numbers[y]x >= iy >= 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;
        }
    }
}