假设有 N 盏灯(NN为不大于 5000 的正整数),从 1 到 N 按顺序依次编号,初始时全部处于开启状态;有 M 个人(M 为不大于 N的正整数)也从 1 到M依次编号。
第一个人(1 号)将灯全部关闭,第二个人(2 号)将编号为 2 的倍数的灯打开,第三个人(3 号)将编号为 3 的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和 3 号一样,将凡是自己编号倍数的灯做相反处理。
请问:当第 M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。
输入格式
输入正整数 N 和 M,以单个空格隔开,M\le NM≤N。
输出格式
顺次输出关闭的灯的编号,其间用逗号间隔。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
10 10
样例输出
1,4,9
思路:额外地开辟空间用于统计,对于开和关的操作对数组进行0/!0标记即可,之后统计输出;
注意:输出格式;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n,m;
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
int[] a=new int[5010];//关键在于打开与关闭对数组如何进行标记
int[] b=new int[5010];
b[0]=a[0]=-1;
for(int i=1;i<=n;i++)
a[i]=0;//标记关闭||打开
for(int i=1;i<=n;i++)
b[i]=i;
for(int i=2;i<=m;i++)
for(int j=1;j<=n;j++)
if(b[j]%i==0&&i==2)
a[j]=j;
else{
if(b[j]%i==0){
if(a[j]==0)
a[j]=j;
else
a[j]=0;
}
}
//按照要求输出
int cnt=0;
for(int i=1;i<=n;i++)
if(a[i]!=b[i]){
cnt++;
}
for(int i=1;i<=n;i++)
if(a[i]!=b[i]){
System.out.print(i);
if((--cnt)!=0)
System.out.print(",");
}
}
}