例题3-1 开灯问题
题目:有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共k个人,问最后有那些灯开着?输入:n和k,输出开着的灯编号。k<=n<=1000。
分析:用sign[1],sign[2],...,sign[n]表示编号为1,2,3,...,n的灯是否开着。模拟这些操作即可:
源码:
#include<stdio.h> #include<string.h> #define MAXN 1000+10 int sign[MAXN]; int light() { int n,k,i,j; scanf("%d%d",&n,&k); //n盏灯,k个人 memset(sign,0,sizeof(sign)); //初始置0关闭所有灯 for(i=1;i<=k;i++) //第i个人按开关 for(j=1;j<=n;j++) //对于第j号灯 if(j%i==0) sign[j] = !sign[j];//按开关 for(i=1;i<=n;i++) { if(sign[i]==1) //如果灯开着 printf("%d ",i); } printf("\n"); return 0; }
时间: 2024-10-31 13:23:03