Fork me on GitHub

点灯问题

点灯问题

 问题描述:

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

输入 n 和 k ,输出开着的灯的编号。k<=n<=1000

输入:

输入一组数据:n 和 k

输出:

输出开着的灯的编号

思路:

首先动态创建一个有n个元素的整型数组,每个元素有1和-1两种状态,分别表示开和关,然后初始化每个元素为-1,表示灯关闭,然后先从1开始遍历k个人,再以k的间隔从k开始遍历每个数组的元素,并让每个元素乘以 -1,最后输出数组中值为1的元素索引+1,即为开着的灯的编号。

 

 

代码:

#include <stdio.h>
#include <malloc.h>


void func(int *num, int n, int k)
{
    int i, j;
    for(i=1;i<=k;i++)
    {
        for(j=i-1;j<n;j+=i)
        {
            num[j] = num[j] * (-1);
        }
    }
     
    // 输出开着的灯编号 
    for(i=0;i<n;i++)
    {
        if(num[i] == 1)
        {
            printf("%d ", i+1);
        }
    }
    
}


int main()
{
    int n;
    int k;
    
    scanf("%d%*c", &n);
    scanf("%d%*c", &k); 
    
    int *num = (int *)malloc(sizeof(int) * n);
    int i;
    for(i=0;i<n;i++)
    {
        num[i] = -1;
    }
    
    func(num, n, k);
    
    free(num);
    
    return 0;
}

测试输出:

 

posted @ 2020-09-28 22:19  小黑子杜  阅读(323)  评论(0编辑  收藏  举报