自学内容网 自学内容网

c++习题12-开关灯

目录

一,题目 

二,思路 

三,代码 


 

一,题目 

 用例输入 1 

10 10

用例输出 1 

1,4,9

二,思路 

  1. 创建可以存放路灯亮灭情况的数组,路灯的编号从1开始,因此在使用for循环去初始化数组时,循环变量i设为1。因为数组长度N不大于5000(可以等于5000),所以循环条件i<=5000(或i<5001)才能够创建满足题目要求的数组。
  2. 总共有M个人会对存放灯亮灭情况的数组进行操作(取反),每个人都是从自己的编号的路灯开始对其亮灭进行修改/取反,如下图所示👇
  3. 因此,在嵌套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
  4. 通过第三步的处理,让对应编号的人对数组指定元素进行操作:对找到的元素取反,然后再赋值回去
  5. 在打印输出结果的时候需要注意的就是逗号的产生,可以定义并初始化一个变量用来控制逗号生成的时间,当变量满足给定的条件时,再输出逗号,否则只输出编号

三,代码 

 

#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;
}

 有问题请在评论区留言或者是私信我,回复时间不超过一天。


原文地址:https://blog.csdn.net/weixin_53046747/article/details/140580951

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!