开灯问题属于C语言中一维数组中较为基础典型的一道练习
问题:
有n盏灯,编号为1~n。第一个人把所有灯都打开,第二个人按下所有编号为2的倍数的开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),以此类推。一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号
样例输入:
7 3
样例输出:
1 5 6 7
【分析】
用a[1],a[2]…..a[n]来表示编号为1,2….n的灯
第二个人按下2的倍数,第三个人按下3的倍数可以通过第几盏灯除以第几个人取余数看是否为0
通过真假判断灯的亮灭
【代码】
#include
#include
#define maxn 1010
int a[maxn];
int main()
{
int n,k,first=1;
memset(a,0,sizeof(a));
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)
if(j%i==0) a[j]=!a[j];
for(int i=1;i<=n;i++)
if(a[i])
{
if(first)
first=0;
else
printf(" ");
printf("%d",i);
}
printf("\n");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include
#include
#define maxn 1010
inta[maxn];
intmain()
{
intn,k,first=1;
memset(a,0,sizeof(a));
scanf("%d%d",&n,&k);
for(inti=1;i<=k;i++)
for(intj=1;j<=n;j++)
if(j%i==0)a[j]=!a[j];
for(inti=1;i<=n;i++)
if(a[i])
{
if(first)
first=0;
else
printf(" ");
printf("%d",i);
}
printf("\n");
return0;
}
部分解释:
memset(a,0,sizeof(a)); 用来表示把数组a清零,他在#include 中定义
接下来
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)
if(j%i==0) a[j]=!a[j];
依次用第几盏灯数除以当前第几个人取余数看是否为0,如果是则取反即1->0 ,0->1来表示灯的亮灭
接下来程序为了避免输出多余的空格,设置了一个标志变量first 开始时定义first=1即为真if(first) first=0;来管理当前输出变量是否为第一个,如果是则first为0即为假,后续每一个值前加一个空格