素数生成与打印代码错误排查:结果不符预期问题
素数筛选函数的问题修复
你编写的素数筛选函数存在两个关键问题,导致输出不符合预期:
- 数组中错误存入了试除变量
i而非当前判断的数count,导致开头出现重复的2; - 因存储对象错误,最终丢失了本该存入的目标素数。
原代码
#include<stdio.h> #include<conio.h> #include<math.h> #include<string.h> #define MAX 100 int func(int lim,int aa[MAX]) { int i,count,num; num = 0; for(count = 2;count<lim;count++) { for(i=2;i<=sqrt(count);i++) { if(count%i==0) break; } if(i>sqrt(count)) { aa[num]=i; num++; } } return num; } int main() { int limit,i,sum; int aa[MAX]; printf("Please input an integer:"); scanf("%d",&limit); sum=func(limit,aa); for(i=0;i<sum;i++) { if(i%10==0&&i!=0) printf("\n"); printf("%5d",aa[i]); } return 0; }
错误分析
- 存储对象错误:当判断
count是素数时,你将i存入数组,但i是用来试除的变量,而非当前的素数count。比如count=2时,内层循环不执行,i=2被存入;count=3时,内层循环同样不执行,i=2再次被存入,导致开头出现重复的2;而count=5时,i最终会到3,此时存入的是3而非5,导致丢失了素数5。 - 冗余头文件:
#include <conio.h>和#include <string.h>未被使用,可移除以精简代码。
修复后的代码
#include<stdio.h> #include<math.h> #define MAX 100 int func(int lim, int aa[MAX]) { int i, count, num; num = 0; for(count = 2; count < lim; count++) { int sqrt_count = sqrt(count); // 提前计算平方根,避免重复调用与浮点精度问题 int is_prime = 1; // 用标记位简化素数判断逻辑 for(i = 2; i <= sqrt_count; i++) { if(count % i == 0) { is_prime = 0; break; } } if(is_prime) { aa[num] = count; // 存储当前判断的素数count num++; } } return num; } int main() { int limit, i, sum; int aa[MAX]; printf("Please input an integer:"); scanf("%d", &limit); sum = func(limit, aa); for(i = 0; i < sum; i++) { if(i % 10 == 0 && i != 0) printf("\n"); printf("%5d", aa[i]); } printf("\n"); // 末尾添加换行,优化输出格式 return 0; }
修复效果
输入6时,会正确输出:
2 3 5
彻底解决了重复值和素数丢失的问题,同时优化了代码逻辑与可读性。
内容的提问来源于stack exchange,提问作者Levis
相关产品推荐
相关产品推荐

