Онлайн компилятор 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 && i != q) break; z = z / 10; i = z; } if (n == m && i != q) printf("YES"); else printf("NO"); return 0; }
这段代码试图判断一个整数中是否存在两个相同的数字,但逻辑比较混乱,变量使用也不清晰。

- 代码先读取一个整数,如果负数则取绝对值,然后试图通过嵌套循环比较数字的每一位。
- 外层循环用 `z` 遍历原数的每一位,内层循环用 `i` 遍历数字的每一位来寻找匹配。
- 但内层循环中 `i` 的值被不断修改,导致外层循环的 `i` 也受影响,逻辑上容易出错。
- 变量 `q` 被赋值为 `z/10`,但后面用 `i != q` 作为条件,这个条件含义不明确,可能想避免比较同一个位置,但实现方式不对。

提示:
- 思考如何在不修改原始数字的情况下,分别提取每一位进行比较。可以考虑用数组存储每一位,或者用两个独立的循环。
- 注意内层循环修改了 `i` 的值,这会影响外层循环后续对 `i` 的使用。考虑是否需要保存原始数字的副本。