小弟刚学java 遇见一体求大神指点思路额

slayer_lc 2013-03-31 03:41:42
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);

}
}
}
}
...全文
238 12 打赏 收藏 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
程猿薇茑 2013-04-02
  • 打赏
  • 举报
回复
六楼讲的很详细,不错!
一脸辣椒 2013-04-02
  • 打赏
  • 举报
回复

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");
		}	
	}
}
yyfhz 2013-04-01
  • 打赏
  • 举报
回复
上面的代码还是有问题,应当是lightstate[i*i-1]=false (忘记了数组下标是从0开始的,晕~) 还可以再榨出一点油水来,那个求方根的可以省略 int i=1; int j=i*i; while (j<=N) { lightstage[j-1]= false; } 这样就可以了
zuoanlxp123 2013-04-01
  • 打赏
  • 举报
回复
刚才那个没有验证,验证完以后的如下:
public class TestFormet {
	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]+",");
		}
		
	}
}
yyfhz 2013-04-01
  • 打赏
  • 举报
回复
式子写错了,应当是 double s = math.Sqrt(N); for (int i=0; i<s; i++) { lightstate[i*i]= false; }
yyfhz 2013-04-01
  • 打赏
  • 举报
回复
可以这么看,对于第i盏灯,如果从第1个人到第i个人中有偶数个人拉过开关了,则它是亮着的。如果有奇数个人拉过开关的,则它是暗的。 譬如说,第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次循环要少。
zuoanlxp123 2013-04-01
  • 打赏
  • 举报
回复
一维boolean数组 里面刚开始全部存true 然后遍历这个数组,再每次对里面的值进行修改就行了。 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); }
OneDayOf2010 2013-04-01
  • 打赏
  • 举报
回复
6楼思路很好,赞一个
Inhibitory 2013-03-31
  • 打赏
  • 举报
回复
import java.util.Arrays;

public class Hello {
    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]);
            }
        }
    }
}
百八烦恼风 2013-03-31
  • 打赏
  • 举报
回复
public static String getOpenLight(int num) {
		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;
	}
菜鸟级高手 2013-03-31
  • 打赏
  • 举报
回复
貌似没必要建二维数组..

public class Test {
	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] + " ");
		}
	}
}
slayer_lc 2013-03-31
  • 打赏
  • 举报
回复
这思路是不是对的啊!~
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);
				
			}
		} 
	}
}

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧