#include <stdio.h>
#include <math.h>
// 算法竞赛的目标是编程对任意输入均得到正确的结果。
// 请先独立完成,如果有困难可以翻阅本书代码仓库中的答案,但一定要再次独立完成。
// “抓住主要矛盾”——始终把学习、实验的焦点集中在最有趣的部分。如果直观地解决方案行得通,就不必追究其背后的原理。
// 编程不是看书看会的,也不是听课听会的,而是练会的。
/**
【题目】开灯问题
有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2
的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯
将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输
入n和k,输出开着的灯的编号。k≤n≤1000。
样例输入:
7 3
样例输出:
1 5 6 7
*/
/**
【分析】通过数组来存储所有的电灯信息,剩下的就是判断倍数以及,电灯开关判断的问题了
*/
#define max 1100
int a[max];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
if (k>n || n> 1000 || k<0) {
printf("Input Error");
return 0;
}
memset(a,0,sizeof(a)); // 设置所有灯为关闭 0表示关闭,1表示开启
int i,j;
for (i=1;i<=k;i++) {
for(j=1;j<=n;j++) {
//依次对电灯进行处理
if (j%i == 0) { // 判断倍数的,太精辟了
a[j] = !a[j];
}
}
}
for (j=1;j<=n;j++) {
if (a[j]) {
printf("%d\\t",j);
}
}
printf("\\n");
return 0;
}
点评:这个有点意思。