一、题目链接
http://noi.openjudge.cn/ch0105/31/
二、解题思路
◎ 根据题目描述,可以确定如下事实:
▲ 1号灯始终是关闭的,因此可以先输出1;
▲ 对于其它灯而言,被第1个人操作后,初始状态是关闭的;
▲ 对于其它灯而言,将继续被其他若干人操作,操作的前提为灯的编号是操作人编号的整数倍;
▲ 对于其它灯而言,最终的状态取决于所有操作过它的人;
◎ 由于涉及取反操作,因此灯的状态用±1表示;
◎ 循环遍历除1号灯以外的其它灯,例如第i号灯:
▲ 标记第i号灯的初始状态为关闭状态;
▲ 循环遍历除第1个人以外的其他人,例如第j个人:
→ 如果i是j的整数倍,说明第j个人可以操作第i号灯,此时对第i号灯的状态做取反操作;
▲ 如果第i号灯最终为关闭状态,输出一个逗号和i。
三、实施步骤
◎ 定义并输入两个int类型的整数N、M,分别代表灯的数量、人的数量;
◎ 定义int类型的整数flag,代表灯的状态;
◎ 输出1;
◎ 通过标记i代表灯的编号,i从2开始,到N为止,递增步长为1,循环处理如下:
▲ 令flag=-1;
▲ 通过标记j代表人的编号,j从2开始,到M为止,递增步长为1,循环处理如下:
if i%j==0:令flag=-flag;
▲ if flag==-1:输出一个逗号和i。
四、Java程序
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int N = input.nextInt();
int M = input.nextInt();
int flag;
System.out.print(1);
for (int i = 2; i <= N; i++) {
flag = -1;
for (int j = 2; j <= M; j++) {
if (i % j == 0) {
flag = -flag;
}
}
if (flag == -1) {
System.out.print("," + i);
}
}
}
}