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

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值