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
",t);
i++;
t = i*i;
}
}
int main()
{
input_data();
get_ans();
return 0;
}