算法入门之开灯问题
开灯问题属于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
- 通过真假判断灯的亮灭
【代码】
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<stdio.h> #include<string.h> #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; } |
部分解释:
memset(a,0,sizeof(a)); 用来表示把数组a清零,他在#include<string.h> 中定义
接下来
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即为假,后续每一个值前加一个空格
近期评论