在线编译器 C

#include <stdio.h> int main() { int i, z, q; scanf("%d", &i); if (i < 0) i = -i; z = i; int n = 0, m = 0; while (z > 0) { m = z % 10; q = z / 10; while (i > 0) { n = i / 10 % 10; if (n == m && i != q) break; i = i / 10; } if (n == m) break; z = z / 10; i = z; } if (n == m) printf("YES"); else printf("NO"); return 0; }
这段代码试图判断一个整数中是否存在两个相同的数字(即是否有重复的数字)。但代码逻辑存在一些问题,导致结果可能不正确。

- 外层循环用 `z` 遍历原数的每一位,内层循环用 `i` 再次遍历整个数来寻找与当前位相同的数字。但内层循环中修改了 `i` 的值,导致后续比较时 `i` 已经不是原来的数了。
- 变量 `q` 被赋值为 `z / 10`,但之后在条件 `i != q` 中比较的是数字和商,这没有意义,因为 `q` 不是原始数字的某一位。
- 当内层循环找到相同数字时,用 `break` 跳出,但此时 `i` 已经被修改,外层循环继续时 `i` 的值可能不正确。

- 提示1:内层循环中修改了 `i` 的值,这会影响外层循环后续对 `i` 的使用。考虑用一个临时变量来保存原始数字,避免修改原值。
- 提示2:条件 `i != q` 的比较对象不对,`q` 是 `z / 10` 的结果,不是数字的某一位。你需要比较的是两个不同的位置上的数字,而不是数字和商。