c++04:数组的应用:点灯问题
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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");
return0;
}
运⾏结果:1 4 9 16 25 36 49 64 81 100(有奇数个因数的数)
补充memset⽤法:
memse(a,0,sizeof(a))的作⽤就是把数组a清零,⽅便⼜便捷。
另⼀个技巧在于输出:为了避免输出多余空格,设置了⼀个标志变量first,可以表⽰当前要输出是否为第⼀个。第⼀个变量前不应有空格,其他都有。
谢谢⼤家!