C#.NET面试题:一批编号为1-100全部开关朝上(开)的灯进行以下操作: 开关编号凡是1的倍数反方向拨一次开关;若该编号也是2的倍数反方向又拨一次开关;若该编号又是3的倍数反方向又拨一次开关……

面试.NET工程师,有一道这样面试题:

代码题:对一批编号为1-100全部开关朝上(开)的灯进行以下操作:
开关编号凡是1的倍数反方向拨一次开关;若该编号也是2的倍数反方向又拨一次开关;若该编号又是3的倍数反方向又拨一次开关……以此类推一直计算到100为止。

计算出开关朝上(开)的灯的数量并给出代码

 

博主当时未加多思索(哈哈,拿出来做个对比,小伙伴们看看就好),便给出了以下答案:

    class Program
    {
        static void Main(string[] args)
        {
            int sum = 0;
            for (int i = 1; i <= 100; i++)
            {
                bool flag = true;//这代表开关朝上
                for (int j = 1; j <= 100; j++)
                {
                    if (i%j==0)
                        flag = false;
                    else
                        flag = true;
                }
                if (flag)//当第一个灯的100执行完成之后,flag为true代表开
                    sum++;
            }
            Console.WriteLine(sum);
            Console.ReadKey();
        }
    }

然鹅,是错的,理想很丰满,现实很骨感,面试官还给我耐心讲解了以下,并提醒我要用数组来存储100盏灯,于是,我回来研究了,以下代码才是正确的:

    class Program
    {
        static void Main(string[] args)
        {
            //假设0是朝上(开),1是朝下(关)
            int[] light = new int[100];
            for (int i = 0; i < 100; i++)
            {
                for (int n = 1; n < 101; n++)
                {
                    if ((i + 1) % n == 0)
                        SetSwitch(light, i);
                }
            }
            int sum = 0;
            for (int i = 0; i < light.Length; i++)
            {
                if (light[i] == 0)
                    sum++;
            }
            Console.WriteLine(sum);//计算出sum=90
            Console.ReadKey();
        }
        public static void SetSwitch(int[] temp, int i)
        {
            if (temp[i] == 0)
                temp[i] = 1;
            else if (temp[i] == 1)
                temp[i] = 0;
        }
    }

其实,n可以直接从2开始,因为毕竟所有数都可以除以1,这里写出来方便阅读,实际设计中还是应该尽量避免冗余哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值