大厅里有100盏灯,每盏灯都编了号码,分别为1-100。每盏灯由一个开关来控制。

小弟学识浅薄,欢迎各位评论指点,谢谢!

<pre name="code" class="html">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

/*
 大厅里有100盏灯,每盏灯都编了号码,分别为1-100。每盏灯由一个开关来控制。(开关按一下,灯亮,再按一下灯灭。开关的编号与被控制的灯相同。)开始时,灯是全灭的。现在按照以下规则按动开关。
 第一次,将所有的灯点亮。
 第二次,将所有2的倍数的开关按一下。
 第三次,将所有3的倍数的开关按一下。
 以此类推。第N次,将所有N的倍数的开关按一下。
 问第N次(N大于等于2,且小于等于100)按完以后,大厅里还有几盏灯是亮的。
 */

public class TurnLight {
	private static int lightNum = 100;
	
	private static int ON = 1;
	
	private static int OFF = 0;

	private ArrayList list = null;

	public static void main(String[] args) throws IOException {
		int n = 0, onLight;
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			n = Integer.parseInt(br.readLine());
		} catch (IOException ie) {
			ie.printStackTrace();
		}

		TurnLight tl = new TurnLight();
		tl.list = new ArrayList();
		tl.initList();
		tl.turnMethod(n);
		onLight = tl.count();
		System.out.println("经过" + n + "次按开关,大厅里还有" + onLight + "盏灯亮着");

		tl.printLightNo();
	}

	private void initList() {
		for (int i = 0; i < 100; i++) {
			list.add(ON);
		}
	}

	private void turnMethod(int n) {
		if (n > 100 || n < 2)
			return;
		else {
			for (int j = 2; j <= n; j++) {
				for (int i = j; i < lightNum; i = i + j) {
					if (list.get(i).equals(ON)) {
						list.set(i, OFF);
					} else if (list.get(i).equals(OFF)) {
						list.set(i, ON);
					} else
						continue;
				}
			}
		}
	}

	private int count() {
		int onNum = 0;
		for (int i = 0; i < lightNum; i++) {
			if (list.get(i).equals(ON))
				onNum++;
		}
		return onNum;
	}

	private void printLightNo() {
		System.out.println("亮着的灯的编号:");
		for (int i = 0; i < 100; i++) {
			if (list.get(i).equals(ON)) {
				System.out.println(i + 1 + " ");
			}
		}
	}
}


 


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值