求小于等于 $N$ 的素数的方法中,有一种方法是将所有从 $2$ 到它本身减 $1$ 的数都除一遍,如果不能整除,就是素数。下列哪个程序,体现了这种方法( )?
A.
if(N >= 3){
cout<<2<<endl;
for(int i = 2; i <= N; i++){
for(int j = 2; j < i; j++){
if(i % j != 0){
flag = 1;
}
}
if(flag == 0){
cout<<i<<endl;
}
flag = 0;
}
}B.
if(N > 2){
for(int i = 3; i <= N; i++){
for(int j = 2; j < i; j++){
if(i % j == 0){
flag = 1;
}
}
if(flag == 0){
cout<<i<<endl;
}
flag = 0;
}
}C.
if(N > 2){
cout<<2<<endl;
for(int i = 3; i <= N; i++){
for(int j = 2; j < i; j++){
if(i % j == 0){
flag = 1;
}
}
if(flag == 0){
cout<<i<<endl;
}
flag = 0;
}
}D.
if(N > 2){
cout<<2<<endl;
for(int i = 3; i <= N; i++){
for(int j = 2; j < i; j++){
if(i % j == 0){
flag = 1;
}
}
if(flag == 0){
cout<<i<<endl;
}
}
}答案C。数组和位运算的代码追踪要特别小心:数组下标从0开始,位运算结果可能不直观。建议画图辅助。
位运算追踪时建议把数字写成二进制形式再逐位计算。
【考点】循环条件与边界判定|素数判定逻辑|flag标记与重置
GESP 三级《算法基础》模块,考查核心能力:循环控制与布尔标志的协作使用。命题人卡住的是考生对"遍历所有除数"这一朴素逻辑的边界把握——很多人会写错循环终止条件,或者忘记重置标志导致后续判断全错。