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

#include <stdio.h> int main() { int i; scanf("%d", &i); int m = 0, n = 0; while (i != 0) { m = i % 10; n = i / 10 % 10; if (n == m) break; i = i / 10; } if (n == m&&n!=0&&m!=0) printf("YES"); else printf("NO"); return 0; }
这段代码试图判断一个整数中是否存在相邻且相等的数字对。它从个位开始,每次比较当前位和它的前一位(十位),如果相等就停止循环,最后根据比较结果输出YES或NO。

- 代码中变量n和m的初始化方式可能导致问题。当输入的数字只有一位时,循环不会执行,此时n和m都是0,但程序会错误地输出NO,而实际上一位数没有相邻数字,应该输出NO,这倒是正确的。但更关键的问题是,当数字中有相邻相等数字时,比如112,循环在第一次比较时发现n和m相等(都是1)就break了,但此时n和m的值是相等的,且都不为0,所以输出YES,这看起来正确。然而,如果数字是110,第一次循环时m=0, n=1,不相等,继续;第二次循环时i变成11,m=1, n=1,相等,此时n和m都是1,输出YES,这也正确。但考虑数字是101,第一次循环m=1, n=0,不相等;第二次i=10,m=0, n=1,不相等;第三次i=1,m=1, n=0,不相等;循环结束,n=0, m=1,条件n==m不成立,输出NO,正确。所以这个逻辑似乎能处理大多数情况,但有一个边界问题:当数字末尾有连续0时,比如100,第一次循环m=0, n=0,相等,但此时n和m都是0,条件n!=0&&m!=0不成立,所以输出NO,而实际上100中有相邻的0,应该输出YES。这里条件判断过于严格,排除了0的情况。

- 另外,循环结束后判断n==m时,如果数字中相邻相等数字出现在中间位置,比如1211,循环会在比较到11时break,此时n=1, m=1,输出YES,正确。但如果数字是1221,循环第一次比较m=1, n=2,不相等;第二次i=122,m=2, n=2,相等,break,输出YES,正确。所以主要问题在于对0的处理。