狱吏问题
代码:
法一:
import java.util.Scanner;
public class sixtynine {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
int[] a=new int[n];
for(int i=1;i<=n;i++) {
a[i-1]=-1;
}
for(int i=1;i<=n;i++) {
for(int j=0;j<n;j++) {
if((j+1)%i==0) {
a[j]=a[j]*(-1);
}
}
}
for(int i=1;i<=n;i++) {
if(a[i-1]==1) {
System.out.println("第"+i+"号牢房门锁是打开的");
}
}
}
}
运行结果:
实际上仔细分析一下你会发现,看的就是门牌号有几个因子,意思就是能除几次,除奇数次的话就是开的。什么样的数会有奇数个因子呢,像8,8的因子有1,8,2,4。像16,16的因子有1,16,2,8,4,因为4*4=16,4重复了。所以只要找n2即可。所以有了法二。
法二:
import java.util.Scanner;
public class seventy {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
for(int i=1;i<=Math.sqrt(n);i++) {
System.out.println("第"+i*i+"号牢房门锁是打开的");
}
}
}
运行结果: