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
相关产品推荐
相关产品推荐

