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

