【2032】灯的开关问题

Time Limit: 20 second
Memory Limit: 20 MB

问题描述有n盏灯放在一排,从1到n依次编号,有n个人也从1到n依次编号,第一个人将灯全部打开,第二个人将凡是2的倍数的灯全部关闭,第三个人将凡是3的倍数的灯作相反处理,第4、5、……、n个人都把自己编号的倍数的灯作相反处理。问第n个人走过后,哪些灯是开着的?(要求不用数组)

Input

输入仅一行
输入灯的盏数n(1≤n≤32767)。

Output

输出开着的灯的序号。

Sample Input

20

Sample Output

1:open
4:open
9:open
16:open
 

【题解】

这题和之前的扑克问题是一样的。每个灯先都被打开。这对应每个数都是1的倍数。

倍数!

36 : 1 36 2 18 3 12 4 9 6  这里可以看到36的因子总数为奇数。只会被操作奇数次,因子最后36号灯会被打开。以此类推可以得出只要灯的序号是完全平方数 它最后就一定是打开着的。

一直i*i  然后i++,判断一下i^2有没有超过n就好。

【代码】

#include <cstdio>

const int MAXN = 30000;

int n;

void input_data()
{
	scanf("%d",&n);
}

void get_ans()
{
	int i = 1;
	int t = i*i; //不断获取i*i的值 然后和n比较,只要没超过n i就一直递增。 
	while (t <= n)
		{
			printf("%d:open\n",t);
			i++;
			t = i*i;
		}
}

int main()
{
	input_data();
	get_ans();
	return 0;	
}


 

posted @ 2017-10-06 19:23  AWCXV  阅读(197)  评论(0编辑  收藏  举报