一、题目链接
http://noi.openjudge.cn/ch0105/31/
二、解题思路
⑴ 根据题目描述,可以确定如下事实:
① 1号灯从头至尾肯定是关闭的,由此可以先输出1;
② 对于i号灯(不含1号灯)而言,被第1个人操作后,其初始状态肯定是关闭的;
③ 对于i号灯(不含1号灯)而言,被第1个人操作后,有可能继续被第2至第m个人中的若干人操作,此时需
要满足条件i % j == 0,这里j代表第2至第m个人中的某个人的编号;
④ 对于i号灯(不含1号灯)而言,最终的状态取决于第2至第m个人中所有操作过它的人;
⑵ 设定一个int变量flag,代表当前灯的状态,1号灯肯定是关闭的,输出1;
⑶ 从2号灯开始,到N号灯为止,通过i循环,做如下操作:
① 令flag = -1,也即当前灯的初始状态是关闭的;
② 从第2个人开始,到第M个人为止,通过j循环,做如下操作:
◎ 如果i % j == 0,代表第j个人可以操作当前灯,则令flag = -flag,也即做相反处理;
③ 在j循环结束后,如果flag等于-1,代表当前灯最终为关闭状态,则输出一个逗号和i;
⑷ 在i循环结束后,所有最终状态为关闭的灯号均被输出。
三、程序代码
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);
}
}
}
}