分享一道关于素数的笔试题

来源:互联网 发布:odata java 编辑:程序博客网 时间:2024/04/27 20:18

    题目:请写代码打印10000之内的素数,讲求效率!

    说实话,这年代如此这般简单的笔试题还真是不多见了,不过今天被我有幸遇到了!虽然我丝毫也高兴不起来,因为我知道笔试再好,面试那关也难过!不知道是不是点背的关系,每次面试总是感觉良好,事后却总无回音。我从自己身上找呀找呀找原因,找到很多。比如,有项目经验,却无大型项目开发经验,而且项目经验并非多得不得了。

    还有就是行业原因,比如,进游戏公司吧,没有游戏开发经验(我说大型的);比如,进什么CAD开发公司吧,除了懂个lisp啥也拿不出手,最可恨的是面试官给个搜索题愣是让我写DP方程。想了N久最后实在无奈,说:用搜索加剪枝也可以吧。他说:搜索复杂度太高,还是DP好。我说,是啊!然后四目相望。过了半天,他可能突然想起不是过来秀双眼皮的,抱歉的对我说:回去等消息吧!回来一查那题目发现目前还是归纳到NP难题里面,哎!只恨大学教科书的更新速度跟不上企业的发展啊,更加感叹,要是我智商超200该多好!可是,智商200我就该去进个科学院啥的啦!哈哈!

    面试反正是一塌糊涂了,其实很多公司的面试官还是蛮好的,也不刁难你,只需你把自己会的都展现给他如果他觉得合适就应该会录用。可惜的是目前还没有几个面试官认为我合适的。IT行业跨度太大,从医疗到殡葬,真是无奇不有。我觉得,如果计算机足够简单,直接让医生空闲时间开发医疗软件好了,他们肯定最能理解需求;其余计算机科班毕业的只需研究如何将编程变得简单即可。可惜的是,连我都觉得这种想法够荒诞,可操作性实在不大。

    不小心跑题了!囧!

    有个判断一个数是否是素数的算法,复杂度为n的根次方,用该算法实现上题真是浑然天成,不过也毫无效率。注意到10000并不是很大,开个数组存储哪些是质数好像并不是不可接受的,就10K,不过早期的程序员肯定心疼得要死,但是,计算机内存就像人民币一样,贬值得厉害。现在的程序员随便开个10M连续空间都不带犹豫的!

    现在数组也开好了,只等着判断哪些是素数,哪些不是了。代码如下:

#define N 10005bool isprimer[N];void get_primer(){    int i = 0, j = 0;    for (i = 0; i < N; ++i)        isprimer[i] = true;    isprimer[0] = false;    isprimer[1] = false;    for (i = 2; i < N; ++i)        if (isprimer[i])            for (j = 2; i * j < N; ++j)                isprimer[i * j] = false;}
    注意到get_primer函数的第一层for循环中加了个质数判断,不加这判断也没关系,但会进行很多没必要的计算,划不来,你说是不?为什么加判断跟不加判断得到的结果一样呢?因为一个合数总能分解成一个质数和另外一个整数的积,至于这意味着什么,不言自明!

    主程序就不写了!


原创粉丝点击