问题描述
有n个灯排成一排,编号为1到n。有m个人从1到m编号。1号将灯全部关闭;2号将凡是2的倍数的灯打开;3号将凡是3的倍数的灯做相反处理(将打开的关闭,将关闭的打开);以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。请计算第m个人操作之后,哪些等是点亮的。从键盘输入两个整数n和m(m<=n<=1000),输出点亮的灯的编号。
输入格式
两个整数n和m
输出格式
一行空格间隔的整数,表示点亮的灯
样例输入
1
5 5
样例输出 1
2 3 5
样例输入
2
5 0
样例输出 2
1 2 3 4 5
时间限制 : 1000 MS 空间限制 : 65536 KB
这道题的数组其实可以用bool类型的,并且在开始赋值为“true”。
#include <iostream>
using namespace std;
bool d[100005];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
d[i]=true;
}
加入一个特判,如果没人关灯(m=0),就直接输出全部开灯的状态。
if (m==0)
{
for(int i=1;i<=n;i++)
{
cout<<i<<" ";
}
然后,在else中,先建立循环,将所有灯关闭。
接下来设双循环,重复判断是倍数编号,再相反处理灯。
最后输出。
else
{
for(int i=1;i<=n;i++)
{
d[i]=false;
}
for(int i=2;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(j%i==0)
{
if(d[j]==true)
{
d[j]=false;
}
else
{
d[j]=true;
}
}
}
}
for(int i=1;i<=n;i++)
{
if(d[i]==true)
{
cout<<i<<" ";
}
}
}
最后代码整合:
#include <iostream>
using namespace std;
bool d[100005];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
d[i]=true;
}
if (m==0)
{
for(int i=1;i<=n;i++)
{
cout<<i<<" ";
}
}
else
{
for(int i=1;i<=n;i++)
{
d[i]=false;
}
for(int i=2;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(j%i==0)
{
if(d[j]==true)
{
d[j]=false;
}
else
{
d[j]=true;
}
}
}
}
for(int i=1;i<=n;i++)
{
if(d[i]==true)
{
cout<<i<<" ";
}
}
}
}