#include <stdio.h>
int main(){
int a;
while(scanf("%d",&a) != EOF){
int b[a];
for(int i = 0;i<a-1;i++){
b[i] = i+2;
}
int temp = 2;
for(int i = 0;i<a-1;i++){ //循环遍历数组
for(int j = i;j<a-1;j++){ //找出可以被2整除的数,置为0
if(b[j]%temp == 0 && b[j] != temp){
b[j] = 0;
}
}
temp++;
}
int count = 0;
for(int i = 0;i<a-1;i++){
if(b[i] != 0){
printf("%d ",b[i]);
}
else{
count++;
}
}
printf("\n%d",count);
}
return 0;
感觉我这种方法与题目要求的一致,较好理解。看了解法,大家都是第二个for都是用 j < i,这个方法也很巧妙,每次i加1的时候,j也可以从2开始,看看当前i有无j的倍数,相当于每次第一层for之后,第二层都会再重复上次的动作;而我这个是按照题目要求,先划掉2意外可以整除2的,然后接着往后,以此类推,直到没法划。个人觉得这样更加便于理解。