Online Compiler C

#include <stdio.h> int main() { int num; scanf("%d",&num); // 处理负数:只考虑数字部分,负号不影响数字相邻 if (num < 0) { num = -num; } // 如果数字只有一位时,不可能有相邻两位 if (num < 10) { printf("NO\n"); return 0; } // 当数字至少两位时 int a,b=0; while(num>=10) { a=num%10; b=(num/10)%10; if(a==b) { printf("YES\n"); return 0; // 找到后立即结束程序 } num=num/10;//去掉当前整数的最后一位数字作为下一次循环的数 } printf("NO\n");// 循环结束仍未找到 return 0; }
这段代码的功能是判断一个整数中是否存在相邻的相同数字。它从用户输入一个整数开始,先处理负数(取绝对值),然后检查数字的每一位,如果发现某一位和它右边的下一位相同,就输出"YES"并结束程序,否则输出"NO"。

- 你的循环条件 `while(num>=10)` 会在数字只剩一位时退出,但此时你只比较了当前最低位和次低位,没有比较更高位的相邻数字。例如输入 `121`,第一次循环比较个位1和十位2,不相等;然后 `num` 变成 `12`,第二次循环比较个位2和十位1,还是不相等,循环结束输出"NO",但实际数字中十位2和百位1并不相邻,所以结果正确。但考虑输入 `112`,第一次循环比较个位2和十位1,不相等;`num` 变成 `11`,第二次循环比较个位1和十位1,相等,输出"YES",正确。所以这个逻辑对于从低位向高位比较是可行的,但要注意:你的比较方式只检查了相邻的两位,而 `num` 每次去掉最后一位,实际上是在检查所有相邻对,所以逻辑本身没有大问题。

- 一个潜在问题是:当输入是 `0` 时,`num` 为0,小于10,直接输出"NO",但0只有一位,没有相邻数字,所以正确。但如果是 `-10`,取绝对值后为10,循环中比较个位0和十位1,不相等,输出"NO",正确。所以代码基本正确,但你可以思考一下:如果输入是 `-101`,取绝对值后为101,循环中比较个位1和十位0,不相等;然后 `num` 变成10,比较个位0和十位1,不相等,输出"NO",但实际数字中百位1和十位0相邻且不同,十位0和个位1相邻且不同,所以正确。因此代码功能上没有问题。