开关灯问题

文章介绍了如何用C++编程解决灯泡开关问题,通过遍历灯号和人数,利用逻辑判断灯的开关状态,最后输出关闭灯的编号。
摘要由CSDN通过智能技术生成

问题描述:

【题目描述】
有N盏灯,编号为1~N,初始状态全部为开启;同时有M个人,编号也为1~M;编号为1的人把所有灯全部关闭,接下来编号为2的人把所有编号为偶数的灯全部打开……每个人都把编号为自己编号的倍数的灯做相反操作。求当所有人都操作完毕后,有哪几盏灯是关闭的。

【输入要求】

首先输入一个整数N,表示有N盏灯;再输入一个整数M,表示有M个人。

【输出要求】

最终关闭的灯的编号,中间用逗号隔开。

【样例输出】

10 10

【样例输出】

1,4,9

问题分析:

主体部分:

这道题的问题在于如何记录每盏灯的状态。在不使用数组的前提下,我们可以考虑这样一种思路:常规方法是模拟题目描述的过程,每个人把自己要操作的灯一次性操作完,这样行不通;那么可以反其道而行之,将每一盏灯交给每个人各操作一遍,当所有人都轮完一遍后,这时灯的状态即为最终状态,我们便可以进行记录并输出。如此循环,将每一盏灯都操作一遍,便可以得到最终结果。

解决方案:

主体部分:

#include<iostream>
using namespace std;
int main()
{
	int n,m,i,j,flag;
	cin>>n>>m;
	for(i=1;i<=n;i++)
	{
		flag=0;
		for(j=1;j<=m;j++)
		{
			if(i%j==0)
			{
				if(flag==0)
				{
					flag=1;
				}
				else
				{
					flag=0;
				}
			}
		}

问题分析:

输出部分:

在解决完主体部分后,我们还遇到一个问题:如何使用逗号分隔输出结果。如果单纯地在输出前加上逗号,便会产生多输入的情况。这时我们可以思考一下:在任何情况下,第一盏灯总是关闭的,因为1的因数只有1,它只会被第一个人操作一次。得到这个结论后,我们便可以判断i是否等于1,

如果等于1就只输出1,否则就输出逗号加i。这样整个问题就解决了。

解决方案:

输出部分:

	    if(i==1)
		{
			cout<<1;
		}
		if(flag==1&&i!=1)
		{
			cout<<","<<i;
		}
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值