/*
有n盏灯,编号1~n。第一个人把所有灯点亮 ,第2个人按下所有编号为2的倍数的灯开关(这些灯将被关掉),
第3人按编号为3的倍数的开关(其中关的灯被打开,开的灯被熄灭),以此类推。一共k个人,问最后有哪些灯开着?
输入:n和k,输出开着的灯编号。k≤n≤1000。
样例输入:7 3
样例输出:1 5 6 7
*/
# include <stdio.h>
# include <string.h>
# define MAXN 1000+10
int a[MAXN];
int main()
{
int i,j,n,k,first = 1;
memset(a,0,sizeof(a));//作用是把数组a清零,在string.h中定义。
scanf("%d%d",&n,&k);
for(i=1; i<=k; i++)
for(j=1; j<=n; j++)
if(j % i == 0)
a[j] = !a[j];//!作为单目运算符,是非运算的意思。该运算符操作0则返回1,操作非零则返回0.!0返回1,!1返回0
for(i=1; i<=n; i++)
if(a[i]){if(first) first=0;else printf(" ");printf("%d",i);}
//为了避免输出多余空格,设置了一个标志变量first,可以表示当前要输出的变量是否为第一个。
//第一个变量前没有空格,但其它都有。
//我的理解是:如果第一个为0,直接执行printf("%d",i); 否则的话,先执行 printf(" ");再执行 printf("%d",i)。
printf("\n");
return 0;
}
开灯问题
最新推荐文章于 2024-11-15 12:58:29 发布