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

关于C++嵌套for循环中数字2被判定为素数的逻辑疑问

素数判定代码中数字2被误判为素数的原因分析

问题代码

void primeFunc(int &number){    
    bool prime_check = false;    
    for( int control = number; control > 1; --control){        
        printf("\tcontrol = %d\n", control);        
        for( int sub_control = control-1; sub_control > 1; --sub_control){            
            printf("\t\tsub_control = %d\n", sub_control);            
            if(control % sub_control == 0){                
                prime_check = false;                
                break;            
            }            
            else prime_check = true;        
        }        
        if(prime_check == true){            
            printf("\n%d", control);        
        }    
    }
}

// 函数调用
int num = 5;
primeFunc(num);

实际输出

control = 5
        control = 4
                sub_control = 3
                sub_control = 2
        control = 3
                sub_control = 2

3       control = 2

2

疑问点

当control=2时,内层循环的sub_control=1不满足sub_control>1的条件,内层循环不会执行,此时prime_check应该保持初始值false,不应输出2,但实际却输出了2。

原因分析

问题出在prime_check的初始化时机:

  • prime_check是在外层循环之外初始化的,只会在函数启动时被设为false一次。
  • 当control=3时,内层循环执行:sub_control=2,3%2≠0,prime_check被设为true,随后3被输出。
  • 进入control=2的循环时,内层循环不执行,prime_check没有被重新赋值,保留了上一次循环的true值,导致判定为素数并输出。

修复方案

把prime_check的声明移到外层循环内部,确保每次判定都是独立的,同时补充2的特殊判定(2是素数,内层循环不会执行):

void primeFunc(int &number){    
    for( int control = number; control > 1; --control){        
        bool prime_check = false; // 移到外层循环内,每次循环重置
        printf("\tcontrol = %d\n", control);        
        for( int sub_control = control-1; sub_control > 1; --sub_control){            
            printf("\t\tsub_control = %d\n", sub_control);            
            if(control % sub_control == 0){                
                prime_check = false;                
                break;            
            }            
            else prime_check = true;        
        }
        // 单独处理2的情况:2是素数,内层循环不执行时直接标记为true
        if(control == 2){
            prime_check = true;
        }        
        if(prime_check == true){            
            printf("\n%d", control);        
        }    
    }
}

另外补充:原代码的素数判定逻辑还有优化空间,比如内层循环只需遍历到sqrt(control)即可,初始时可默认数为素数,找到因数再标记为非素数,这样能提升效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:52:45