一道面试题的解决办法

来源:互联网 发布:mac版chrome翻墙插件 编辑:程序博客网 时间:2024/06/05 21:57

题目:有100盏灯,从1~100编上号,开始时所有的灯都是关着的,第一次,把所有编号是1的倍数的灯的开关状态改变一次;第二次,把所有编号是2的倍数的灯的开关状态改变一次;第三次,把所有编号是3的倍数的灯的开关状态改变一次;以此类推,直到把所有编号是100得倍数的灯的开关状态改变一次.问,此时所有开着的灯的编号.

分析:一拿到题目就很直白的想到用程序按照题目的意思定义一个大小为100的数组,按照每次的做法来改变存储的值,姑且0为关,1为开。其实仔细一想完全没有必要,题目的意思就是考虑100以内的自然数的因数的个数为基数还是偶数。举个例子:6有1,2,3,6工4个因数,所以最后编号为6的灯为关闭。也就是说我们只需要找到因数为奇数的编号就行了。

            for (int j = 1; j < 101; j++)            {                CountByIndex ci = new CountByIndex();                int count = ci.getIndex(j);                if(count%2!=0)                {                    Console.WriteLine(j + ":" + "Turn Off");                }else                {                    Console.WriteLine(j + ":" + "Turn On");                }            }

public int getIndex(int index)        {            int all = 0;            for (int i = 2; i <= index; i++)            {                if (index % i == 0)                {                    all++;                }            }            return all;        }
最后运行程序结果为:1,4,25,36,49,64,81,100各位知道原因了吗?亮的是1、4、9、16、25、36、49、64、81、100这10盏编号是完全平方数的灯,因为它们的开关被拉的次数是奇数次.为什么完全平方数的约数个数是奇数呢?有一个算约数个数的方法:
设某数为A,将A分解质因数是A=a1^n1*a2^n2*a3^n3……an^nn 
则它的约数个数是(n1+1)*(n2+1)*(n3+1)……(nn+1) 
若它是完全平方数,则n1、n2、n3……nn必须是偶数,那么(n1+1)、
(n2+1)、(n3+1)……(nn+1)都是奇数,若干个奇数相乘仍得奇数.

0 0