版权声明:本文为博主原创文章,未经博主允许不得转载,如果有错误,欢迎指正,提前感谢。 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语言中 & 这个符号的作用:
- 取地址符
- 两个& (&&)
- 位运算
位操作中的与操作运算符。也就是常说的and操作,双目运算符。
计算的时候按位计算,&两边操作数对应位上全为1时,结果的该位值为1。否则 该位值为0
1010 0101
& ------> 0010 0100 (00->0 10->0 01->0 11->1)
0111 0110