开灯问题
时间限制:3000 ms | 内存限制:65535 KB
难度:1
-
描述
-
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号。k≤n≤1000
-
输入
- 输入一组数据:n和k 输出
- 输出开着的灯编号 样例输入
-
7 3
样例输出
-
1 5 6 7
这一题也是让我醉了。 最简单的题,比赛中还没做出来!! 在讨论区看了一大牛思路,也算懂了。。。
结题思路:
定义一个数组,下标代表灯的编号,利用双循环对数组赋值,比如,第一个人把所有灯打开,所有赋值为1,第二个人,把2的倍数的灯再加1,第三个人把3的倍数的灯加1,灯的开关与下表对应的数的奇偶性相关,奇数表示灯开,偶数表示灯关。。
代码如下:
#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { int n,k,i,j,a[1100]; while(scanf("%d%d",&n,&k)!=EOF) { memset(a,0,sizeof(a));//数组要清零 for(i=1;i<=k;i++) { for(j=1;j<=n;j++) { if(j%i==0) { a[j]++; } } } for(j=1;j<=n;j++) { if(a[j]&1) printf("%d ",j); } printf("\n"); } return 0; }