《算法竞赛入门经典》(刘汝佳) 有n盏灯,编号1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉), 第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依次类推。一共有k个人,问最后由哪些灯开着? 样例输入: 7 3 样例输出 1 5 6 7 分析:用a[1],a[2],a[3],...,a[n]表示编号为1,2,3,...,n的灯是否开着,模拟这些操作即可。1."memset(a,0,sizeof(a))"的作用是把数组清零,它也在string.h中定义。虽然也能用for循环完成相同的工作,但用memset又方便又快捷。#include <stdio.h> #include<stdio.h> #include<string.h> #define maxn 1010 int a[maxn]; int main(){ int n,k;//n盏灯,k个人 int first = 1;//第一个不用空格 scanf("%d%d",&n,&k); memset(a,0,sizeof(a)); for(int i = 1;i <= k;i++)//k个人,每人按下开关 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; }
2.为了避免输出多余的空格,设置了一个标志变量first,可以表示当前要输出的变量是否为第一个。第一个变量前不应该有空格,但其他变量都有
开灯问题
最新推荐文章于 2020-11-01 15:17:20 发布