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

C语言打印0到n素数程序中使用取模运算时for循环仅运行一次问题

故障原因
  • 核心触发点是除零未定义行为:内层for循环的迭代变量j从0开始初始化,第一次内层循环执行i % j时,本质是计算0除以0的余数,C语言中除数为0属于非法操作,会直接导致程序异常终止,这就是外层循环仅执行1次、没有任何素数输出的直接原因。
  • 素数判断逻辑存在多处错误:
    • 素数的定义是大于1的自然数,原程序外层循环从i=0开始遍历,0、1本身不属于素数范围,无判断必要
    • 因数判断的遍历范围逻辑不合理,从1开始遍历才符合因数计数的逻辑,原计数条件c == 1的前提和初始值为0的遍历逻辑不匹配
修复方案

可以按以下逻辑修改代码:

  1. 外层循环从i=2开始遍历,跳过本身不是素数的0和1
  2. 内层循环j的初始值改为2,不需要统计1的整除次数,判断规则改为:如果存在2到i/2范围内的数可以整除i,则判定为非素数,直接跳出内层循环
  3. 内层循环遍历完成后如果没有找到可整除的数,就判定为素数直接输出

修改后的完整代码如下:

/*This is a c program I made to print prime numbers between 0 and n*/

#include <stdio.h>

int main()
{
    int n;
    printf("Enter the value of n\n");
    
    scanf("%d", &n);
    
    int i, j;
    // 素数从2开始判断
    for (i = 2; i <= n; i++)
    {
        int is_prime = 1; // 标记是否为素数,1代表是素数
         
        for (j = 2; j <= i / 2; j++)
        {
            if (i % j == 0)
            { 
                is_prime = 0;
                break; // 已经找到因数,直接跳出循环不需要继续判断
            }
        }
        
        if (is_prime)
        {
            printf("%d\n", i);
        }
    }
    return 0;
}

如果需要进一步优化性能,还可以将内层循环的上限从i/2改为sqrt(i),减少不必要的遍历次数。

内容的提问来源于stack exchange,提问作者Dehlan Shandirkayr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:15:03