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

#include <stdio.h> enum { size = 10 }; int main() { int a[size]; for (int i = 0; i < size; i++) { scanf("%d", &a[i]); } for (int i = 0; i < size; i++) { if (a[i] >= 0) { if (a[i] >= 100) { if ((a[i] - (a[i] % 10)) % 10 == 0) { printf("%d ", a[i]); } } if (a[i] < 10 && a[i] > 0) { printf("%d ", a[i]); } } if (a[i] < 0) { a[i] = -a[i]; if (a[i] >= 0) { if (a[i] >= 100) { if ((a[i] - (a[i] % 10)) % 10 == 0) { printf("%d ", -a[i]); } } if (a[i] < 10 && a[i] > 0) { printf("%d ", -a[i]); } } } } return 0; }
这段代码的功能是:读取10个整数,然后输出其中满足特定条件的数。条件似乎是:如果一个数的绝对值是两位数且十位为0(比如100、200、-100等),或者绝对值是一位数且不为0(比如1到9、-1到-9),则输出这个数(包括负号)。

代码中存在逻辑错误和冗余。主要问题在于判断数字的十位是否为0时,条件写错了。当前条件 `(a[i] - (a[i] % 10)) % 10 == 0` 实际上是在检查数字去掉个位后是否能被10整除,这总是成立的(因为去掉个位后末尾是0),所以这个条件没有正确判断十位是否为0。

- 提示1:要判断一个数的十位是否为0,应该先提取十位数字。对于三位数,可以用 `(a[i] / 10) % 10` 得到十位数字,然后检查它是否等于0。
- 提示2:代码中对负数的处理重复了正数的逻辑,可以简化。先统一取绝对值判断,再根据原数的正负决定输出时是否加负号,这样能减少重复代码。