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; }