1109:开关灯(C 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

【代码】

#include <iostream>
#include <cstdio>	
using namespace std;
int main()
{
    
    
	int N,M,s=0,q=0;
	cin>>N>>M;	//输入N ,M 
	int a[N+1];	//编号从1开始到N 
	if(M==0)	//没人的时候 默认全亮  无输出 
	return 0; 
	for(int i=1;i<=N;i++)	
	{
    
    
		a[i]=-1;  //初始状态为开 但至少有一个人 定义为-1全关闭状态  不进下面循环  
	} 
 	for(int i=2;i<=M;i++)	//从2开始 
 	{
    
    
 		for(int j=1;j<=N;j++) 
		{
    
    
			if(j%i==0) a[j]*=-1;//自己的倍数 翻转 
		}	
	}
	for(int i=1;i<=N;i++)	
	{
    
    
		 
		if(a[i]==-1)	//输出关闭状态 
		{
    
    
			if(q==0) 	//第一个数前面不输出逗号 
			{
    
    
				cout<<i;
				q=1;	//第一个数后 修改q值 
			}
			else		//其余数前面输出一个逗号 
			cout<<","<<i;	
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_50901683/article/details/108990299
C++