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

#include <stdio.h> int main() { int n,i=1; scanf("%d", &n); while(n>9){ int digit1=n%10; int digit2=(n/10)%10; if(digit1==digit2){ printf("YES\n"); return 0;//end the progrm } n=n/10; } printf("NO\n"); return 0; }
这段代码的功能是:读入一个整数,检查其中是否有任意两个相邻的数字相同。如果有,输出YES并立即结束;否则输出NO。

代码的思路是:在循环中不断取出当前数字的最后两位,比较它们是否相等。如果相等就输出YES并结束;如果不相等,就去掉最后一位,继续检查剩下的数字。

你的代码有一个逻辑问题。考虑一下:当数字是12321时,你的程序会检查哪些相邻对?它检查的是(1,2)、(2,3)、(3,2)、(2,1)吗?实际上你的循环只检查了最后两位,然后去掉最后一位,所以检查的顺序是(1,2)、(2,3)、(3,2)、(2,1),这没问题。但问题在于,当数字是112时,你的程序会先检查最后两位(1,2),不相等,去掉最后一位变成11,再检查(1,1),相等,输出YES。这看起来正确。

但考虑数字是121时,你的程序检查(2,1)不相等,去掉最后一位变成12,检查(1,2)不相等,然后n变成1,循环结束,输出NO。这正确,因为121没有相邻相同数字。

你的代码似乎能正确工作。但有一个潜在问题:当n是负数时,你的程序会怎样?因为n是int,输入负数时,n>9不成立,直接输出NO。但负数也可能有相邻相同数字,比如-112。你的代码没有处理负数。另外,当n是0到9之间的数时,直接输出NO,但个位数没有相邻数字,输出NO是合理的。

所以主要问题是对负数的处理。你可以考虑取绝对值,或者修改循环条件。