问题描述:
【题目描述】
有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;
}