学习C++和C语言心得 9
分享一道非常有趣的题
开关门
题目描述:
宾馆里有n个房间,从1∼n编了号,开始都是关闭的。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”…,以后每个服务员都是如此。当第n
个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)
输入描述:
房间数n(2≤n≤1000)。
输出描述:
一行,由小到大的打开门的房间序号,各序号之间用一个空格隔开。
输入
100
输出
1 4 9 16 25 36 49 64 81 100
我的代码:
#include<iostream>
using namespace std;
int main()
{
int n,i,j,flag=0;
cin>>n;
int a[1003]={0};
for(i=1;i<=n;i++)
a[i]=1;
for(i=2;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j%i==0)
a[j]=-a[j];
}
}
for(i=1;i<=n;i++)
{
if(a[i]==1&&flag==0)
{
flag=1;
cout<<i;
}else if(a[i]==1&&flag==1)
{
cout<<" "<<i;
}
}
}
这道题让我知道把开关定义为一个相反数这种思路的简便,还有让我知道了将一个数判断100遍和将100个数判断一遍两种写法的步骤与不同。