刘汝佳小白书-开灯问题

版权声明:本文为博主原创文章,未经博主允许不得转载,如果有错误,欢迎指正,提前感谢。 https://blog.csdn.net/Quinlan_/article/details/83930235

开灯问题

描述

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

输入

输入一组数据:n 和 k

输出

输出开着的灯编号

样例输入

7 3

样例输出

1 5 6 7

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 1010

int arr[MAXN];
int main()
{
    int n, k;
    scanf("%d %d", &n, &k);
    memset(arr, 0, sizeof(arr));
    for(int i=1; i<=k; i++)
    {
        for(int j=1; j<=n; j++)
        {
        // 注释1
            if( j % i == 0 )
                arr[j] = !arr[j];
       // 这里
        }
    }
    for(int j=1; j<=n; j++)
    {
    	// 注释2
        if( arr[j] )
            printf("%d ", j);
       // 这里
    }
    return 0;
}

之前实现代码的时候, 注释1 的地方 写成了

        if( j % i == 0 )
          arr[j]++;

这时候注释2的地方代码应该改成

扫描二维码关注公众号,回复: 5390461 查看本文章
    if( arr[j] & 1 )
        printf("%d ", j);

这里是想说一下 c语言中 & 这个符号的作用:

  1. 取地址符
  2. 两个& (&&)
  3. 位运算

位操作中的与操作运算符。也就是常说的and操作,双目运算符。
计算的时候按位计算,&两边操作数对应位上全为1时,结果的该位值为1。否则 该位值为0

  1010 0101 
      &   ------> 0010 0100     (00->0   10->0   01->0   11->1)                    
  0111 0110

猜你喜欢

转载自blog.csdn.net/Quinlan_/article/details/83930235