N盏灯排成一排,从1到N按顺序依次编号。 有N个人也从1到N依次编号。 第一个人(1号)将灯全部关闭。第二个人(2号)将凡是2和2的倍数的灯 全部做相反处理 第3个人(3号)也是将3个3的倍数的灯座相反处理,后面的人和2号3号一样 吧自己和自己倍数的灯做相反处理 问当第N个人的时候 哪几盏灯是亮的。
public class light {
public static void main(String args[]){
boolean[][] a = new boolean [10][10];
for(int i = 0 ; i<a.length; i++){
for(int j = 0 ; j<a[i].length ; j++){
if(i == 1){
a[i][j]=false;
}
if(j%2 == 0){
if(a[i][j]==true){
a[i][j] = false;
}else if(a[i][j]==false){
a[i][j] = true;
}
}
}
}
for(int i = 0 ; i <a.length ;i++){
for(int j =0 ; j<a[i].length ; j++){
if(a[i][j] == true)
System.out.println(i+"+"+j);
}
}
}
}java
public class light {
public static void main(String args[]){
boolean[][] a = new boolean [10][10];
for(int i = 0 ; i<a.length; i++){
for(int j = 0 ; j<a[i].length ; j++){
if(i == 1){
a[i][j]=false;
}
if(j%2 == 0){
if(a[i][j]==true){
a[i][j] = false;
}else if(a[i][j]==false){
a[i][j] = true;
}
}
}
}
for(int i = 0 ; i <a.length ;i++){
for(int j =0 ; j<a[i].length ; j++){
if(a[i][j] == true)
System.out.println(i+"+"+j);
}
}
}
}java
public class light {
public static void main(String args[]){
boolean[][] a = new boolean [10][10];
for(int i = 0 ; i<a.length; i++){
for(int j = 0 ; j<a[i].length ; j++){
if(i == 1){
a[i][j]=false;
}
if(j==i || (j+1)%(i+1) == 0){
if(a[i][j]==true){
a[i][j] = false;
}else if(a[i][j]==false){
a[i][j] = true;
}
}
}
}
for(int i = 0 ; i <a.length ;i++){
for(int j =0 ; j<a[i].length ; j++){
if(a[i][j] == true)
System.out.println(i+"+"+j);
}
}
}
}
public static void main(String[] args) {
boolean[] b = new boolean[11];
for(int i=0; i<b.length; i++) {
b[i] = false;
} for(int i=2; i<b.length; i++) {
int sign = i;
for(int j=2; j<b.length; j++) {
if(j % sign == 0) {
if(b[j] == true)
b[j] = false;
else b[j] = true;
}
}
}
for(int i=1; i<b.length; i++) {
System.out.print(b[i] + " ");
}
}
}
boolean[] lights=new boolean[num];
System.out.println(Arrays.toString(lights));
for (int i = 2; i < num+1; i++) {
System.out.println("第"+(i)+"个人");
for (int j = 1; j < num+1; j++) {
//灯=0和人=1和=0时候就有错了,我随便这样处理了一下
if (j %i == 0) {
if(lights[j-1])
lights[j-1]=false;
else
lights[j-1]=true;
}
}
System.out.println(Arrays.toString(lights));
}
return null;
}
public static void main(String[] args) {
boolean[] lightStates = new boolean[100]; // 99个灯,为了方便,第一个元素不使用.
Arrays.fill(lightStates, true); int n = 10; // 10个人
for (int i = 1; i < n; ++i) {
for (int l = 1; l < lightStates.length; ++l) {
if (l % i == 0) {
lightStates[l] = !lightStates[l];
}
}
} for (int i = 1; i < lightStates.length; ++i) {
if (lightStates[i]) {
System.out.println("Light " + i + " is on " + lightStates[i]);
}
}
}
}
然后遍历这个数组,再每次对里面的值进行修改就行了。
public static void main(String[] args) {
//初始化的时候所有都是false表示等都灭着;
Boolean lightStates []=new Boolean[100];
for(int i=0;i<lightStates.length;i++){
for(int j=0;j<lightStates.length;j++){
if((j+1)%(i+1)==0){
if(lightStates[j])
lightStates[j]=false;
else
lightStates[j]=true;
}
}
}
//打印最后的状态
System.out.println(lightStates);
}
譬如说,第1盏灯,只有第1个人会拉,所以最后一定是暗的。而第2盏灯,由于有第1个人和第2个人来拉,所以最后一定是亮的。
还可以继续推导出第3盏扥最后是亮的,第4盏灯最后是暗的,第5盏灯最后是亮的等等。
写成式子就是:
找出从1~i找i的可整除的不同因子数(包括1和i在内)。如果因子数为偶数,则i是亮着的;如果是奇数,则i是暗的。
可是怎么可能是奇数呢?如果k是i的一个因子,则i/k也必定是i的一个因子。那么应该因子数是偶数才对。
所以因子数为奇数当且仅当i是完全平方数。
所以代码类似
boolean[] lightstate = new boolean[N];
for (int i=0; i<N; i++) {
lightstate[i]=true;
}
double s = math.Sqrt(N);for (int i=0; i<s; i++) {
lightstate[i]= false;
}//打印输出
for (int i=0; i<N; i++) {
if (lightstate[i]) {
system.out.println("第"+Integer.parseInt(i+1)+"号灯是亮着的")
} else {
system.out.println("第"+Integer.parseInt(i+1)+"号灯是暗的")
}
}
这样程序时间复杂度为O(N),比2次循环要少。
double s = math.Sqrt(N);
for (int i=0; i<s; i++) {
lightstate[i*i]= false;
}
public static void main(String[] args) {
//初始化的时候所有都是false表示等都灭着;
Boolean lightStates []=new Boolean[100];
Arrays.fill(lightStates, true);
for(int i=0;i<lightStates.length;i++){
for(int j=0;j<lightStates.length;j++){
if((j+1)%(i+1)==0){
if(lightStates[j])
lightStates[j]=false;
else
lightStates[j]=true;
}
}
}
//打印最后的状态
for(int i=0;i<lightStates.length;i++){
System.out.print(lightStates[i]+",");
}
}
}
还可以再榨出一点油水来,那个求方根的可以省略
int i=1;
int j=i*i;
while (j<=N) {
lightstage[j-1]= false;
}
这样就可以了
class ArrTest
{
public static void main(String[] args)
{
boolean[] temp = new boolean[10];
int y = 0;
//x代表人数,y代表灯数
for(int x = 1 ;x <= temp.length ;x++)
{
for(y = x;y <= temp.length; y++)
{
if(x == 0)
{
temp[x-1] = true;
}
if(y%x == 0)
{
if(temp[y-1] == false)
{
temp[y-1] = true;
}
else
{
temp[y-1] = false;
}
}
}
}
for(int x = 0;x<temp.length;x++)
{
System.out.print(temp[x] + "\t");
}
}
}