在线编译器 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]>=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]<=-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”的数,以及“绝对值小于10”的数(即-9到9之间的数,不包括0?实际上包含了0吗?需要检查)。

代码中存在逻辑错误,导致输出条件不正确。主要问题在于判断个位数为0的方式有误。

- 对于正数,你用了 `(a[i]-(a[i]%10))%10==0` 来判断个位是否为0。但 `a[i]-(a[i]%10)` 的结果是去掉个位后的数,比如123变成120,120%10确实等于0。但更简单的方法是直接 `a[i]%10==0`。你的写法虽然能工作,但过于复杂,且对负数处理有隐患。
- 对于负数,你用了 `(a[i]-(a[i]%10))%10==0`,但C语言中负数取模的结果是负数或0,例如 `-123%10` 结果是-3,那么 `-123 - (-3) = -120`,`-120%10` 结果是0,所以这个条件对负数也成立。但你的代码中,负数部分的条件嵌套有重复,导致逻辑混乱。
- 关键问题:你的条件 `if(a[i]>=100)` 和 `if(a[i]<=-100)` 限制了只处理绝对值大于等于100的数,但题目可能要求所有个位为0的数(包括10,20等)都输出。你漏掉了10到99之间的个位为0的数,以及-10到-99之间的数。
- 另外,对于绝对值小于10的数,你分别处理了正数和负数,但条件 `a[i]>-10&&a[i]<0` 和 `a[i]<10&&a[i]>0` 是正确的,不过注意0没有被包含(因为条件要求大于0或小于0),这可能是有意为之。

提示:
- 检查你的条件范围:是否应该对所有数判断个位是否为0,而不仅仅是绝对值大于等于100的数?
- 简化个位判断:直接使用 `a[i] % 10 == 0` 即可,无需复杂计算。