3366 - 开门大吉

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

宾馆里有n个房间,从1~n编了号,第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间作相反处理,第三个服务员把是3的倍数的房间做相反处理,…,以后每个服务员都是如此,当第n个服务员来过后,那几扇门市打开的?(所谓相反处理是指,原来开着的门关上,原来关上的门打开。)

题目输入

输入只有一行,为正整数n(0<n<105)。

题目输出

输出为一行,为开着的门的房间号,不同的房间号之间用一个空格分开。

输入/输出样例

输入格式

100

输出格式

1 4 9 16 25 36 49 64 81 100

C++解答

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<iostream>
using namespace std;
main ()
{   bool a[100000];
     int j,n;
	//memset(a,0,sizeof(a));
	 memset(a,0,sizeof(a)); 
	 scanf("%d",&n);
	  for (int i=1;i<=n;i++)
	  {  j=1;
	    while (i*j<=n)  
	    {
	        if (a[i*j]) {a[i*j]=false;} else {a[i*j]=true
	        ;};
	        j++;
	    }
      }
    for (int i=1;i<=n ;i++)
    {
     if (a[i])
      //printf("%d",i);
      printf("%d ",i);
    }
      return 0;
}