开灯问题

来源:互联网 发布:云计算技术 编辑:程序博客网 时间:2024/06/09 14:35

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

Input
输入n和k。k≤n≤1000。

Output
输出开着的灯编号。

Sample Input
7 3

Sample Output
1 5 6 7

本题算法思想:
用a[1],a[2],…,a[n]表示编号为1,2,3,…,n的灯是否开着;0表示关,1表示开。

代码:

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<algorithm>#include<string.h>using namespace std;#define MAXN 1000+10int a[MAXN];int main()  {      int n,k,i,j,first=1;    while(scanf("%d%d",&n,&k)!=EOF)    {        memset(a,0,sizeof(a)); //一开始全部灯都是关闭的         for(i=1;i<=k;i++)     //每到一个人,就遍历一遍灯         {            for(j=1;j<=n;j++)            {                if(j%i==0)    //因为是看当前灯的编号是否为第i个人的i倍,所以是判断j%i                 {                    a[j]=!a[j]; //在c语言里面是非零即真,!的意思是取反; 这里的意思将为0的数取为1,将不为1的数赋值为0                }            }        }        for(i=1;i<=n;i++)        {            if(a[i])       //判断是否输出i值             {                if(first)     //判断是否输出空格                 {                    first=0;                    printf("%d",i);                }                else                {                    printf(" ");                    printf("%d",i);                }            }        }        printf("\n");    }     return 0;  } 

这里写图片描述

原创粉丝点击