Онлайн компилятор C

#include <stdio.h> #include <stdlib.h> int main() { int n; scanf("%d", &n); n = abs(n); // 忽略负号 int seen[10] = {0}; if (n == 0) { // 只有一位数字0,没有重复 printf("NO\n"); return 0; } while (n > 0) { int d = n % 10; if (seen[d]) { printf("YES\n"); return 0; } seen[d] = 1; n /= 10; } printf("NO\n"); return 0; }
这段代码的功能是判断一个整数中是否有重复的数字。它先取绝对值,然后逐位检查每个数字是否出现过,如果发现重复就输出YES,否则输出NO。

- 代码对输入0的处理是直接输出NO,但0本身只有一位数字,确实没有重复,这个逻辑是正确的。
- 注意:当输入为负数时,代码用abs取绝对值,但负数中的负号本身不是数字,所以只处理数字部分是正确的。不过,如果输入是像-123这样的数,它只检查数字部分,不会把负号当作数字,这符合题意。

- 提示1:考虑一下,如果输入的数字很大,比如超过int范围,会发生什么?scanf读取int时可能会溢出,但题目通常不会测试这种情况,不过你可以思考如何更安全地处理输入。
- 提示2:代码中seen数组的大小是10,因为十进制数字只有0-9,这是合理的。但注意,如果输入是0,代码直接返回NO,而while循环不会执行,这没问题。但你可以想想,如果输入是像100这样的数,代码会正确检测到重复的0吗?当前逻辑是逐个数字检查,遇到重复就返回,所以对于100,先检查1(未重复),再检查0(未重复),再检查0(重复),会输出YES,这是正确的。