b763

輸入說明 :

輸入只有一行,一個數字N,代表學姊心裡想的數字介於 1~N 之間

輸出說明 :

輸出有兩行,第一行M代表在最優秀的策略下你只要詢問M個問題就能猜中

第二行有由小到大排序好的M個數字X1 ~ XM ,代表阿倫會詢問學姊「你猜的數字是否會被Xi 整除呢?」

這題問的其實是,某個數以下,可以分解成哪些質數,和質數次方倍相乘

像45 : 就有 2 3 4 5 7 8 9 11 13 16 17 19 23 25 27 29 31 32 36 37

也就是說45以下的質全部可以用上面的數字乘積表示出來

所以我先把1000以內的質數找出來,再把這些質數的次方倍不超過1000的找出來

之後查表即可

#include<stdio.h>
#include<math.h>
int main()
{
    int N;
    scanf("%d",&N);

    //建質數表 
    int p[1001];
    int i,j,k;

    for(i=0;i<1001;i++)
    {
        p[i]=1;
    }

    p[0]=0;
    p[1]=0;

    int temp =sqrt(1000);

    for(i=2;i<1001;i++)
        if(p[i])
        {
            for(j=i*i;j<1001;j+=i)
            p[j]=0;
        }

    //建質數次方表
    for(i=2;i<=temp;i++)
        if(p[i])
        {    j=i*i;
            while(j<=1000)
            {
                p[j]=1;
                j*=i;
            }
        }

    int count=0;

    for(i=2;i<=N;i++)
    {
        if(p[i])
        {
            count++;
        }
    }

    printf("%d\n",count);

    for(i=2;i<=N;i++)
    {
        if(p[i])
        {
            printf("%d ",i);
        }
    }
}