为何两段C语言程序输出结果不一致?需求为统计特定整数并打印
问题分析与修正:两段C程序的逻辑偏差导致输出不一致
核心需求明确
先把需求拆清楚:
- 统计范围:1到500的整数
- 统计目标:不被3、5、7中任意一个整除的数的总数
- 打印目标:同时被3、5、7整除的数(也就是被105整除的数,因为3、5、7的最小公倍数是105)
两段程序的逻辑错误点
第一段程序的问题
第一段逻辑是「仅打印同时被3、5、7整除的数,其余所有数都计入统计」——这完全搞错了统计范围。需求要的是统计不被任何一个整除的数,但这段代码把「被3/5/7中某一个或两个整除的数」也都算进了统计里。比如数字3、5、15这些不符合统计要求的数,都会被计入count。
错误代码示例:
#include <stdio.h> int main() { int count = 0; for (int i = 1; i <= 500; i++) { if (i % 3 == 0 && i % 5 == 0 && i % 7 == 0) { printf("%d\n", i); } else { count++; } } printf("Count: %d\n", count); return 0; }
这段代码的count实际是500 - 同时被三个数整除的数的数量,和需求完全不符。
第二段程序的问题
第二段逻辑是「仅计数不被3、5、7整除的数,其余所有数都打印」——这搞错了打印范围。需求只要求打印同时被三个数整除的数,但这段代码会把所有「被3/5/7中至少一个整除的数」都打印出来,比如3、5、7、15这些只满足单个或两个整除条件的数,都会被错误输出。
错误代码示例:
#include <stdio.h> int main() { int count = 0; for (int i = 1; i <= 500; i++) { if (i % 3 != 0 && i % 5 != 0 && i % 7 != 0) { count++; } else { printf("%d\n", i); } } printf("Count: %d\n", count); return 0; }
这段代码的printf输出范围远大于需求要求的范围。
正确的实现逻辑
要同时满足两个需求,需要在循环里分开做两个独立判断:
- 判断当前数是否同时被3、5、7整除,是则打印
- 判断当前数是否不被3、5、7中的任何一个整除,是则计数
正确代码示例:
#include <stdio.h> int main() { int count = 0; for (int i = 1; i <= 500; i++) { // 打印同时被3、5、7整除的数 if (i % 3 == 0 && i % 5 == 0 && i % 7 == 0) { printf("同时被3、5、7整除的数:%d\n", i); } // 统计不被3、5、7中任意一个整除的数 if (i % 3 != 0 && i % 5 != 0 && i % 7 != 0) { count++; } } printf("不被3、5、7整除的数的数量:%d\n", count); return 0; }
验证结果
1-500中同时被3、5、7整除的数有:105、210、315、420,共4个。
不被3、5、7中任意一个整除的数的数量为229个(通过容斥原理计算得出),正确代码运行后会输出这4个数和计数229。
内容的提问来源于stack exchange,提问作者Ramanjit Singh
相关产品推荐
相关产品推荐

