c++04:数组的应用:点灯问题

今天来和大家分享一道题:开门问题(有的地方是点灯问题)

宾馆里面有100个房间,从1到100编号,

第一个服务员把所有门打开,

第二个服务员把所有编号2倍数的门做相反处理,

第三个服务员把所有编号为3倍数的门做相反处理,

以此类推,到第100个服务员来做处理之后,问哪些门是开着的?

下面是分析:

分析:用a[1],a[2],……,a[n]表示编号1,2,3,……,n的门是否开着,模拟操作即可,程序如下:

#include <cstdio>
#include <cstring>
#define MAXN 100+10
int a[MAXN];
int main(){
    int first=1;
    memset(a,0, sizeof(a));
    for (int i=1;i<=100;++i)
        for (int j=1 ;j<=100 ;++j)
            if (j%i==0)
                a[j]=!a[j];
    for (int i=1;i<=100;++i)
        if (a[i]){
            if (first)
                first=0;
            else
                printf(" ");
            printf("%d",i);
        }
    printf("\n");
    return 0;
}

运行结果:1 4 9 16 25 36 49 64 81 100(有奇数个因数的数)

补充memset用法:

memse(a,0,sizeof(a))的作用就是把数组a清零,方便又便捷。

另一个技巧在于输出:为了避免输出多余空格,设置了一个标志变量first,可以表示当前要输出是否为第一个。第一个变量前不应有空格,其他都有。

 

谢谢大家!

 

posted on 2020-07-04 14:26  饭皮大哈必胜  阅读(626)  评论(0编辑  收藏  举报