1.有一百盏灯,全部亮着并且从一到一百进行编号,对每盏灯做如下处理,如果该灯的编号能被1整除则拨一下开关,能被二整除再拨一下,以此类推,直到该灯的编号为至,问最后哪几盏灯亮着。
2、编写一个类,向外提供一个这样的方法:查看该类在内存中有多少个实例。
3、自己写出一个满足单例模式的类。

解决方案 »

  1.   

    2、原理是利用静态成员记数,生成对象(以下这个类只能通过构造函数生成)的时候记数加1,JVM回收对象的时候记数-1。代码如下:public class Test {
        private static int count = 0;
        public Test() {
            count++;
        }
        public static int getInstanceNumbre() {
            return count;
        }
        protected void finalize() throws Throwable {
            count--;
            super.finalize();
        }
    }
      

  2.   

    3、原理是构造函数设为private,这样就不能在类的外面生成对象。而在类里面手动生成一个对象(这就是唯一的对象),并且提供static的getInstance()方法使得类的外面可以获得这个生成的对象。代码如下:public class Singleton {
        private static Singleton instance = new Singleton();
        private Singleton() {}
        public static Singleton getInstance() {
            return instance;
        }
    }
      

  3.   

    1,没看懂
    2,public class QueryInstance {
         private static int total = 0;
         public QueryInstance(){
           total ++;
         }
         public static int getTotal() {
           return total;
         }
         public static void main(String[] args) throws Exception{
           Class clazz = Class.forName("test.QueryInstance");
           QueryInstance qi0 = (QueryInstance)clazz.newInstance();
             for (int i = 0; i < 10; i++){
               QueryInstance qi = new QueryInstance();
               System.out.println(QueryInstance.getTotal());
             }
         }
    }
    3,
    public class Singleton {
    private int total;
    private Singleton(){
    }
    private static Singleton instance;
    /**
     * 
     * 考虑到并发的话,需要synchronized
     */
    public synchronized static Singleton getInstance(){
    if (instance == null){
    instance = new Singleton();
    }
    return instance;
    }

    public void print(){
    System.out.println(total ++);
    }

    public static void main(String[] args) {
    for (int i = 0; i < 10; i ++){
    Singleton instance = Singleton.getInstance();
    instance.print();
    }
    }}
      

  4.   

    1、代码如下:class Lamp {
        private int number; //灯的编号
        private boolean isOn = true; //最初灯是开着的
        public Lamp(int i) {
            number = i;
        }
        public int getNumber() {
            return number;
        }
        public boolean lampIsOn() {
            return isOn;
        }
        public void operate() {
            int count = 0; //开关灯次数
            for (int i = 1; i <= number; i++) {
                //第i次操作时,如果i能整除number,则开关灯次数加1
                if (number % i == 0) {
                    count++;
                }
            }
            if (count % 2 != 0) {
                isOn = false;
                //如果开关灯次数为奇数,则最后灯是关着的
            }
        }
    }
    public class Lamps {
        public static void main(String[] args) {
            Lamp[] la = new Lamp[100];
            for (int i = 0; i < la.length; i++) {
                la[i] = new Lamp(i + 1);
                la[i].operate();
                if (la[i].lampIsOn()) {
                    System.out.println(la[i].getNumber());
                }
            }
        }
    }
      

  5.   

    public class Test {  public staic void main(String[] args) {
      
        int count = 0;
        
        for (int i = 1; i <=100; i++) {
           if (isCloot(i)) {
             count++;
           }
        }  }
      
      private static boolean isCloot(int num) {
        int count = 1;
            for (int i = 1; i < i / 2 + 1; i++) {
                if (num % i == 0) {
                    count++;
                }
            }
            return count % 2 == 0;
      }
    }
      

  6.   

    写错了:
    public class Test {  public staic void main(String[] args) {
      
        int count = 0;
        
        for (int i = 1; i <=100; i++) {
           if (isCloot(i)) {
             count++;
           }
        }
    System.out.println(count);
      }
      
      private static boolean isCloot(int num) {
        int count = 1;
            for (int i = 1; i < num / 2 + 1; i++) {
                if (num % i == 0) {
                    count++;
                }
            }
            return count % 2 == 0;
      }
    }
      

  7.   

    1
    public class Baideng{
       public static void main(String  []args){
          boolean  []deng= new boolean[101];//数组默认值为false, 表示灯是开着的;
            for(int i=1;i<=100;i++){
               for(int j=1;j<=100;j++){
                  if((j%i)==0)
                  deng[j]=!deng[j];
            }
          } 
          for(int i=1;i<deng.length;i++){
            if(!deng[i])
              System.out.println("第"+i+"灯是亮着的");
          } 
       }
    }
      

  8.   

    brooksychen(初晨之阳) 正解,典型的面向对象编程,理解得太好了1、代码如下:class Lamp {
        private int number; //灯的编号
        private boolean isOn = true; //最初灯是开着的
        public Lamp(int i) {
            number = i;
        }
        public int getNumber() {
            return number;
        }
        public boolean lampIsOn() {
            return isOn;
        }
        public void operate() {
            int count = 0; //开关灯次数
            for (int i = 1; i <= number; i++) {
                //第i次操作时,如果i能整除number,则开关灯次数加1
                if (number % i == 0) {
                    count++;
                }
            }
            if (count % 2 != 0) {
                isOn = false;
                //如果开关灯次数为奇数,则最后灯是关着的
            }
        }
    }
    public class Lamps {
        public static void main(String[] args) {
            Lamp[] la = new Lamp[100];
            for (int i = 0; i < la.length; i++) {
                la[i] = new Lamp(i + 1);
                la[i].operate();
                if (la[i].lampIsOn()) {
                    System.out.println(la[i].getNumber());
                }
            }
        }
    }
      

  9.   

    public static void light_state(int n)
        {
            int s=0;
            for (int i=1;i<=n;i++)
            {
                for (int j=1;j<=i;j++)
                {
                    if (i%j==0)
                    {
                        s++;
                    }
                }
                if (s%2==0)
                System.out.println(i);//i是灯的编号
                s=0;
            }
        }
      

  10.   

    1.
    package com.java.Test;import java.util.*;public class checkLamp { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Lamp(100);
    } public static void Lamp(int n) {
    Map map = new HashMap();
    StringBuffer sb = new StringBuffer("");
    for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= i/2; j++) {
    if (i % j == 0) {
    map.put(String.valueOf(i), String
    .valueOf(Integer.parseInt((String) map.get(String
    .valueOf(i)) == null ? "0" : (String) map
    .get(String.valueOf(i)))
    + j));
    }
    }
    map.put(String.valueOf(i), String
    .valueOf(Integer.parseInt((String) map.get(String
    .valueOf(i)) == null ? "0" : (String) map
    .get(String.valueOf(i)))
    + i));
    }
    String key = "";
    int count = 0;
    Set set = map.keySet();
    Iterator iterator = set.iterator();
    while (iterator.hasNext()) {
    key = (String) iterator.next();
    if (Integer.parseInt((String) map.get(key)) % 2 == 0) {
    sb.append(key + ",");
    count++;
    }
    }
    if (sb.toString() != null && !"".equals(sb.toString())) {
    System.out.println("亮着的灯的编号为: "
    + sb.toString().substring(0, sb.toString().length() - 1));
    } else {
    System.out.println("所有的灯都熄灭了!");
    }
    System.out.println("共有" + count + "盏灯亮着!");
    }
    }
      

  11.   

    第一题和第三题都比较简单,好解决,但是第二道题我就不是很明白了,哪位高手如果知道解决办法的话请发送答案到:[email protected]小弟这里先谢过了!