计算灯的开关状态
有 N 个灯放在一排,从 1 到 N 依次顺序编号。有 N 个人也从 1 到 N 依次编号。1 号将灯全部关闭,2号将凡是 2 的倍数的灯打开;3 号将凡是 3 的倍数的灯作相反处理(该灯如为打开的, 则将它关闭;如关闭的,则将它打开)。以后的人都和 3 号一样,将凡是自己编号倍数的灯作相反处理。试计算第 N 个操作后,哪几盏灯是点亮的。(0-表示灯打开,1-表示灯关闭)
输入 :N
输出:每盏灯的状态
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N, i;
unsigned int *p;
scanf("%d", &N);
p = (unsigned int*)malloc(sizeof(unsigned int)*N);
memset(p, 0, sizeof(unsigned int)*N);
for(int k = 1; k <= N; ++k){
if (k == 1){
continue;
}else if (k == 2){
for (i = 1; i <= N; i++){
p[i-1] = 1;
}
}else{
for(i = k; i <= N; i=i+k){
if (p[i-1]){
p[i-1] = 0;
}else{
p[i-1] = 1;
}
}
}
}
for(int j = 1; j <= N; ++j){
printf("%d", p[j-1]);
if (j != N){
printf(" ");
}else{
printf("\n");
}
}
free(p);
return 0;
}