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

C语言素数计算程序运行无响应问题排查请求(num=4)

素数计算程序无响应问题排查

问题描述

用C语言编写的素数计算程序,当设置num=4时程序长时间无响应,使用M2 MacBook Air上的最新版Xcode编译运行,希望先排查代码本身的问题,暂不考虑更换算法。

原始代码

#include <stdio.h>

int main() {
    int num = 0;
    printf("Enter the number of prime numbers you want to find : ");
    scanf("%d", &num);
    int prime[num], store = 0, load = 0, dividend = 1, signal = 1, i;
    prime[0] = 2;
    while (store < num) {
        for (load = 0; load < store; load++) {
            if (dividend % prime[load] == 0) {
                signal = signal * 0;
            }
        }
        if (signal == 1) { // if 'dividend' value is a prime number, store dividend in the array of 'prime'.
           prime[store] = dividend;
           store++;
        }
        signal = 1;
        dividend++;
    }
    for (i = 0; i < num; i++) {
        printf("%d \n", prime[i]);
    }
    return 0;
}

/*
 signal == 1 : prime
 signal == 0 : not prime
 
 1. prime[load] == NALL
 2. for any value in the array 'prime', 'dividend % prime[load] != 0' //dividend is prime number
    signal * 0 
*/

问题根源

代码存在两个关键逻辑错误,直接导致num=4时进入无限循环:

  • 初始值逻辑冲突:你已经手动将第一个素数2存入prime[0],但store初始值设为0,而非1。第一次循环时,内层for循环因load < store(0<0)不执行,signal保持1,错误地将dividend=1覆盖到prime[0]中。
  • 素数判定逻辑彻底失效:1不是素数,且任何整数对1取余结果都是0,后续所有dividend都会被判定为非素数,store永远无法增长,while(store < num)会无限执行。

修复后的代码

#include <stdio.h>

int main() {
    int num = 0;
    printf("Enter the number of prime numbers you want to find : ");
    scanf("%d", &num);
    // 处理非法输入
    if (num <= 0) {
        printf("Please enter a positive integer.\n");
        return 1;
    }
    int prime[num], store = 1, load = 0, dividend = 3, signal = 1, i;
    prime[0] = 2; // 第一个素数已存入,store初始为1
    while (store < num) {
        for (load = 0; load < store; load++) {
            if (dividend % prime[load] == 0) {
                signal = 0;
                break; // 发现能整除直接退出循环,减少无效计算
            }
        }
        if (signal == 1) {
           prime[store] = dividend;
           store++;
        }
        signal = 1;
        dividend++;
    }
    for (i = 0; i < num; i++) {
        printf("%d \n", prime[i]);
    }
    return 0;
}

修复说明

  • 修正store初始值为1,对应已存入的素数2;dividend从3开始,跳过1和已存入的2。
  • 内层循环中,一旦发现dividend能被某个素数整除,立即标记并退出循环,减少不必要的计算。
  • 增加num<=0的边界判断,避免非法输入导致的异常。

内容的提问来源于stack exchange,提问作者23 3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:22:49