[C++] 开灯问题(两个思路)

[C++] 开灯问题(两个思路)

两个思路
一个用到数组,从人的角度出发;
一个不用数组,从灯泡的角度出发。

题目

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

样例输入:

7 3

样例输出:

1 5 6 7

第一个思路分析

创建一个a[n]数组,开灯全置1代表灯亮状态,后每次操作(不管开灯还是关灯)时,都对原来元素取非。最后依次判断灯泡状态,输出。

代码实现

int main()
{
    int n, k, i;
    cin>>n>>k;
    int a[n];
    for(i = 0; i < n; i++)   //初始化灯泡
        a[i] = 1;
    for(i = 2; i <= k; i++)
    {
        for(int p = 1; p < n; p++)
        {
            if((p+1) % i == 0)		//操作开关
                a[p] = !a[p];
        }
    }
    for(i = 0; i < n; i++)
    {
        if(a[i])       //判断输出
            cout<<i+1<<" ";
    }
    return 0;
}

第二个思路分析

不用初始化数组,用一个字符m=1表示灯泡开着,然后分别对每一个灯泡操作,比如7个灯泡4个人,那么循环到第2个灯泡,只需要第2个人操作一次,循环到第4个灯泡需要第2个和第4个人总操作两次。在遍历所有从第2个开始的所有人后,判断灯泡状态。

代码实现

int main()
{
    int n, k, m = 1;
    cin>>n>>k;
    for(int i = 1; i <= n; i++)
    {
        for(int p = 2; p <= k; p++)
        {
            if(i % p == 0 )    //操作灯泡
                m = !m;
        }
        if(m)				//判断输出
            cout<<i;
        m = 1;
    }
    return 0;
}
发布了19 篇原创文章 · 获赞 11 · 访问量 2420

猜你喜欢

转载自blog.csdn.net/Cedric_6/article/details/104117577