目录
一,题目
二,思路
三,代码
一,题目
用例输入 1
10 10
用例输出 1
1,4,9
二,思路
- 创建可以存放路灯亮灭情况的数组,路灯的编号从1开始,因此在使用for循环去初始化数组时,循环变量i设为1。因为数组长度N不大于5000(可以等于5000),所以循环条件i<=5000(或i<5001)才能够创建满足题目要求的数组。
- 总共有M个人会对存放灯亮灭情况的数组进行操作(取反),每个人都是从自己的编号的路灯开始对其亮灭进行修改/取反,如下图所示👇
- 因此,在嵌套for循环时,第一个for循环表示人的操作(循环变量设为i,并且长度为M,人的编号也是从1开始,所以i为1,循环条件i<M+1或i<=M),第二个for循环表示人对灯亮灭的操作(如果第二个for循环的循环变量为j,那么j的初始值就是i,循环结束的条件j<=N或j<N+1,需要注意的是,j是按照倍数进行自增的,当i=2时,表示编号为2的人操作灯,接下来,都是对2的倍数进行操作,其实就是在j的基础上不断加上i,例如4(i=2,j=2,j+i=4),6(i=2,j=4,j+i=6),8(i=2,j=6,j+i=8)等,因此,j的操作表达式为:j+=i
- 通过第三步的处理,让对应编号的人对数组指定元素进行操作:对找到的元素取反,然后再赋值回去
- 在打印输出结果的时候需要注意的就是逗号的产生,可以定义并初始化一个变量用来控制逗号生成的时间,当变量满足给定的条件时,再输出逗号,否则只输出编号
三,代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N,M,a[5001],f=1;
cin>>N>>M;
for(int i=1; i<N+1; i++) a[i]=1;
for(int i=1; i<M+1; i++)
{
for(int j=i; j<N+1; j+=i) a[j]=!a[j];
}
for(int i=1;i<N+1;i++){
if(!a[i]) {
if(!f) cout<<",";
cout<<i;
f=0;
}
}
return 0;
}
有问题请在评论区留言或者是私信我,回复时间不超过一天。