#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的,然后接着往后,以此类推,直到没法划。个人觉得这样更加便于理解。