数据结构练习

计算灯的开关状态

有 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("
");
        }
    }

    free(p);

    return 0;
}

原文地址:https://www.cnblogs.com/wreng/p/15200943.html