开灯问题

Posted Amysear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开灯问题相关的知识,希望对你有一定的参考价值。

开灯问题

时间限制:3000 ms            内存限制:65535 KB

难度:1

描述

有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号。k≤n≤1000

 

输入

输入一组数据:n和k

输出

输出开着的灯编号

样例输入

7 3

样例输出

1 5 6 7

 1 #include <stdio.h>
 2 #include<string.h>
 3 #define MAX 1010
 4 int arr[MAX];
 5 int main()
 6 {
 7     int n=0,k=0;
 8     memset(arr,0,sizeof(arr));
 9     scanf("%d",&n);
10     scanf("%d",&k);
11     for(int i=1;i<=k;i++)
12         for(int j = 1;j<=n;j++)
13             if(j%i == 0) arr[j]=!arr[j];
14     for(int k = 1;k<=n;k++)
15     {
16         if(arr[k])
17         {
18             printf("%d",k);
19             if(k!=n)
20                 printf(" ");
21         }
22     }
23     return 0;
24 }

 

注意:

  1. 比较大的数组尽量声明在main()之外,否则程序可能无法运行
  2. 数组不能够直接赋值。例如,声明的是int a[MAX],b[MAX];是不能直接a = b的。如果要把数组a 复制k个元素到数组b,可以:memcpy(b,a,sizeof(int)*k)。同理如果要复制浮点型的数组,应写为:memcpy(b,a,sizeof(float)*k)。若要把数组a全部复制到数组b中,可以写得更简单:memcpy(b,a,sizeof(a))
  3. 使用memcpy()函数需要引入头文件string.h
  4. Memset(a,0,sizeof)的作用是把数组a清0

 

以上是关于开灯问题的主要内容,如果未能解决你的问题,请参考以下文章

开灯问题

开灯问题

开灯问题

开灯问题--------《算法竞赛入门指导》P83

NYOJ_77 开灯问题

算法竞赛入门经典_3.1_数组_逆序输出_开灯问题