随笔分类 -  acm

求小于N的所有素数
摘要:解法1:检查每一个数K,在2~sqrt(K)区间内是否含有它的因子。解法2:我们可以按照从1到N的顺序来验证一个数是否为质数,这样当我们验证K的时候,所有小于K的质数都已经求得。那么我们没必要验证2~sqrt(K)区间内的有没有K的因子,我们只需要验证这个区间内的所有质数中有没有K的因子。解法3:筛选法,先假设所有数都是质数,然后从2开始筛掉所有2的倍数,然后从没被筛掉的第一个数开始,继续筛选。每一个数被筛选了X次,X为它的质因子数目-2。解法4:筛选法,在上述筛选法中每一个数被筛选了X次。例如6,它被2和3各筛选了1次。如何避免这种重复筛选呢?我们可以把一个合数分解为a×p,p为a 阅读全文

posted @ 2013-04-15 13:24 十指之间 阅读(1723) 评论(0) 推荐(0)

递归中隐藏的陷阱 stack overflow
摘要:在设计程序的时候我们常常使用递归函数,它常常能够使我们的代码简洁明了。但是,这其中也隐藏着一个陷阱——那就是递归深度是有限制的,这点非常容易被初学者忽略。 我们知道函数的每一次调用,参数和返回地址都要入栈,其实函数中的局部变量也是要占用栈空间的(不信可以在函数体内声明一个1000000大小的数组,运行程序直接崩溃,如果把他改成全局变量就没事了)。而栈空间又是比较小的(相对于堆),因此我们的程序如果执行了一个很深的递归调用,就有可能发生stack overflow这样的错误。初学ACM的同学可能会经常发现自己的程序runtime error了,但是又没有数组越界访问,一种很有可能的原因... 阅读全文

posted @ 2013-04-01 21:19 十指之间 阅读(2685) 评论(0) 推荐(1)

POJ 1496 Word Index map超时分析
摘要:题意:大约是就按照下面的方式给字符串编号,然后给你一个字符串让你输出它的编号。a -> 1b -> 2. .z -> 26ab -> 27ac -> 28. .az -> 51bc -> 52. .vwxyz -> 83681解法:没有想到很好的解法,所以就枚举了。因为解的范围并不大,最多83681。而且每一步的代价并不大:3个步骤:保存结果,自加,进位。发现问题:保存结果很自然想到的是用map<string,int>,因为这样的话就可以在O(lg(n))的复杂度下找到结果。但是,这样做的结果超时了。后来改成保存在数组里,这样查找一个 阅读全文

posted @ 2013-03-22 22:38 十指之间 阅读(527) 评论(0) 推荐(0)

导航