标签:lse ret def code print turn efi 技巧 max
今天来和大家分享一道题:开门问题(有的地方是点灯问题)
宾馆里面有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,可以表示当前要输出是否为第一个。第一个变量前不应有空格,其他都有。
谢谢大家!
标签:lse ret def code print turn efi 技巧 max
原文地址:https://www.cnblogs.com/lucasyy/p/13234823.html