You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

修正说明

  1. 修复数组越界:将循环条件改为i<20,确保仅访问数组合法下标范围
  2. 传递数组大小:给checkPrime增加size参数,明确遍历的元素总数
  3. 重构质数判断:
    • 提前过滤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:25:44