C语言从斐波那契数列筛选质数的代码异常问题排查
问题分析与修复方案
你的代码存在多个核心问题,导致质数筛选逻辑完全错误,以下是问题拆解和修正后的代码:
原代码的关键错误
- 数组越界:定义
arr[20]但循环到i<=20,数组下标最大为19,越界访问会触发未定义行为 sizeof失效:数组作为参数传递时会退化为指针,sizeof(a)得到的是指针大小(通常4/8字节),不是数组元素个数- 质数判断逻辑混乱:
- 错误用
a[i]%2==0代替a[i]%j==0,仅判断是否为偶数,未检查所有可能因数 - 判断条件完全颠倒:
count>1时判定为质数,实际质数的因数统计应该为0(除1和自身外无其他因数) - 未处理0、1、2这些特殊值:0和1不是质数,2是质数但会被错误排除
- 错误用
修正后的完整代码
#include <stdio.h> // 提前声明函数 void checkPrime(int a[], int size); void fib() { int a=0, b=1, arr[20]; arr[0] = a; arr[1] = b; printf("%d, %d,", a, b); int c=0; // 修正循环边界,避免越界 for(int i=2; i<20; i++) { c = a + b; arr[i] = c; printf("%d,", c); a = b; b = c; } printf("\n"); // 显式传递数组元素个数 checkPrime(arr, 20); } void checkPrime(int a[], int size) { int i, count; for(i=0; i<size; i++) { int num = a[i]; // 过滤0、1这类非质数 if(num <= 1) continue; // 单独处理唯一的偶质数2 if(num == 2) { printf("%d is a Prime\n", num); continue; } count = 0; // 优化循环边界到sqrt(num),减少计算量 for(int j=2; j*j <= num; j++) { if(num % j == 0) { count++; // 找到因数直接退出循环,无需继续判断 break; } } // 无额外因数则为质数 if(count == 0) { printf("%d is a Prime\n", num); } } } int main() { fib(); return 0; }
修正说明
- 修复数组越界:将循环条件改为
i<20,确保仅访问数组合法下标范围 - 传递数组大小:给
checkPrime增加size参数,明确遍历的元素总数 - 重构质数判断:
- 提前过滤0、1这类非质数
- 单独处理2这个特殊的偶质数
- 循环到
sqrt(num)优化性能,找到因数立即终止循环 - 正确判断逻辑:当无额外因数时,判定为质数
输出示例
0, 1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181, 2 is a Prime 3 is a Prime 5 is a Prime 13 is a Prime 89 is a Prime 233 is a Prime 1597 is a Prime 4181 is a Prime
内容的提问来源于stack exchange,提问作者just_a_glitch
相关产品推荐
相关产品推荐

