一道智力题

我害怕自己被黑暗吞噬,企图写一些似乎无关紧要的东西,分开注意力……其实我最近发现自己有个特点,就是时不时会回想过去遇到过的一些问题,得出一些新的结论或者寻求一些新的解法,我的问题也不一定是什么难题,有时无非是些能稍微动动脑筋的东西罢了。但不管怎样,我自己还是挺喜欢自己这个特点的,尤其在这个迷惘的季节。

 

这是我差不多一年前碰到的笔试题目,就是我今天离开的这个公司的笔试题目,如果做过这种题目,我想一点难度都没有,即使没做过,难度应该也不大,但不知道是不是当时我不在状态,或者由于前面的题目太多(7页纸),做到后面自己的耐力就不行了,反正是做错了,题目是这样的:

 

100盏灯,给它们编号从1开始到100,初始状态全亮,然后从第一盏灯开始改变灯的状态,凡是序号为1的整数倍的灯状态全部置反(亮的变灭,灭的变亮),接着从第二盏灯开始改变灯的状态,凡是序号为2的整数倍的灯状态全部置反,完之后从第三盏灯开始……依此类推,直到从第100盏灯开始执行这个操作为止。请问操作全部完成后这100盏灯的状态。

 

当时我想出了个错误的答案,后来经过面试官提醒,我也承认了自己确实做错了,要求给我加时,但几分钟下来我还是没想出来,只好询问答案,面试官说:“答案不重要了,知道的很快的。”面试结束后我回到公司(嗯,当时请半天假去的)还是想不出来,结果自己编了个程序来算,答案是肯定算出来了,但自己还是百思不得其解,想想还真有意思。那次面试的结果当然是成功的了,也许是因为我过五关斩六将把前面的技术题都搞定了,他们也不会在乎我后面这道题目。

 

现在离开公司了,以一种我不太期望的方式……不知怎么又想起这道题目,但脑神经似乎被小捣了一下,突然发现这道题目如此简单……

 

灯的初始状态是亮,被置奇数次就会灭,被置偶数次就会亮,那么只需要分析什么数会被置奇数次,什么数会被置偶数次就可以了。首先想想质数,除了1和自己,不会被任何数整除,那从1开始,不管中间经过多少数,它的状态都一直是“灭”,直到从它自己开始,才会被置第二次,变成亮,所有质数结果都是亮的了,235711……等都是亮,那么更多的数不是质数,状态如何?其实学会了对质数序号的思考,其它也差不多,拿69做一下实验就知道了,6在以序号1236作为开始的时候会被反置,其中23正好一对,能将6整除,乘积又是6;另外看一下9,作为同样非质数的9,在序号139作为开始的时候会被反置,为什么不是被反置4次而是3次?其实本来应该是4次,33正好等于9,但不巧的是33重复了,构不成一对,所以是被反置3次,那16呢?25呢?一样的,16124816作为开始的时候被反置,也是奇数次,那么149162536……这种自然数的乘方数其实都同理,被反置奇数次,最终状态是灭,其余的数都是被反置偶数次,结果还是亮的。这就是答案……

 

题目确实没什么,但我纳闷我当时为什么想不明白呢?也许这才是真正的难题。

 

写完这篇文章的时候又是第二天了,最近总熬夜,而且想不出什么合适的理由,希望自己早日走出阴霾,今年成为不平凡的一年。^o^

 

 
#include  " stdafx.h "
#include 
< string .h >

char  lights[ 101 ];

int  main( int  argc,  char *  argv[])
{
    
int  i, j;
    memset(lights, 
1 100 );
    
for (i = 1 ; i <= 100 ; i ++ )
    {
        printf(
" [%d] " , lights[i]);
    }

    
for (i = 1 ; i <= 100 ; i ++ )
    {
        
for (j = 1 ; i * j <= 100 ; j ++ )
        {
            lights[i
* j] = (lights[i * j] == 1 ? 0 : 1 );
        }
    }

    printf(
" " );
    
for (i = 1 ; i <= 100 ; i ++ )
    {
        printf(
" [%d] " , lights[i]);
    }
    
return   0 ;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值