日期:2014-05-17  浏览次数:20937 次

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


求思路加代码  谢谢
------最佳解决方案--------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _01
{
    class Program
    {
        static int divisor = 2;     //除数因子,因为从第二次开始算,所以取2
        static int[] lights = new int[100];    //100个灯的数组
            
        static void Main(string[] args)
        {
            for (int i = 0; i < lights.Length; i++)
            {
                lights[i] = 1;               //初始化所有灯的值为1(任何整数均可,打开就是正的,关了就乘-1
            }
            int n =100;
            int result = count(n);         //第100次的结果
            Console.WriteLine("第{0}次,大厅里还有{1}盏灯是亮的",n,result);
            Console.ReadKey();
        }
        static int count(int n)
        {
            if (n >= 2)    //从2次起算,1次直接返回100
            {
                loop(n);   //暴力循环,模拟开关n次
                int sum = 0;
                for (int i = 0; i < lights.Length; i++)
                {
                    if (lights[i]> 0)
                    {
                        sum += 1;     //把最后循环的结果,遍历一次,大于0的表示灯的状态是开,用sum记录
                    }