开关灯(c++题解)

题目描述

假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于关闭状态;有M个人(M为不大于N的正整数)也从1到M依次编号。

第一个人(1号)将灯全部打开,第二个人(2号)将编号为2的倍数的灯关闭,第三个人(3号)将编号为3的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。

请问:当第M个人操作之后,哪几盏灯是打开的,按从小到大输出其编号,其间用逗号间隔。

输入格式

输入正整数N和M,以单个空格隔开。

输出格式

顺次输出打开的灯的编号,其间用逗号间隔。

样例

样例输入
复制10 10
样例输出
复制1,4,9

____________________________________________________________________________
日常发作业题解。 

也是简单到爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆表的题

写作不易,点个赞呗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

_________________________________________________________________________

 方法1
#include 
using namespace std;
int a[1000005];
int n,m;
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		for(int j=1;j*i<=n;j++){
			a[j*i]++;
		}
	}
	int flag=1;
	for(int i=1;i
 方法2
#include 
using namespace std;
int n,m,ans;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int flag=-1;
		for(int j=1;j<=m;j++){
			if(i%j==0)flag=0-flag;
		}
		if(ans!=0&&flag==1)cout<<",";
		if(flag==1)ans++,cout<

你可能感兴趣的:(c++,算法,数据结构)