Tag: of eratosthenes

使用eratosthenes筛子的Spoj PRIME1(在C中)

我正在尝试使用Eratosthenes的分段筛来解决问题PRIME1 。 我的程序可以正常筛选,达到NEW_MAX 。 但是在n > NEW_MAX情况下存在一些问题,其中分段筛分发挥作用。 在这种情况下,它只打印所有数字。 以下是包含相关测试用例的代码的链接: http : //ideone.com/8H5lK#view_edit_box /* segmented sieve */ #include #include #include #define MAX_LIMIT 1000000000 //10^9 #define NEW_MAX 31623 /*SQUARE ROOT OF 1000000000*/ #define MAX_WIDTH 100000 //10^5 char flags[NEW_MAX+100]; /*TO PREVENT SEGMENTATION FAULT*/ void initialise(char flagarr[], long int n) //initialise all elements to true from 1 to n […]

生成从1到n的素数,崩溃n> 3亿

有关如何让这个程序工作n = 1万亿(除了升级/购买新计算机)的任何建议? 错误如下:构建后,正在执行的程序(命令行样式输出窗口弹出)然后快速关闭,我得到以下错误“ProjectPrimes.exe已停止工作(Windows正在寻找解决方案这个问题。“我怀疑这与内存问题有关,因为我第一次遇到n = 2000万,但那是在我选择malloc / free’筛子’arrays之前(即我的’筛’arrays是大arrays)尺寸nx 1,每个元素由1或0组成。 该程序需要大约35秒才能完成前3亿个整数(16,252,325个素数),所以没关系,但没什么了不起的。 正如我所提到的,目标是能够产生低于1万亿的质数,所以我还有很长的路要走…… 如果相关,这是我的机器规格(如果在这台机器上目标恰好是不合理的):2.40ghz i5,4GB RAM,64位Windows 7。 方法概述,对于那些不熟悉的人:我们使用Sienda of Sundaram方法。 在没有进入certificate的情况下,我们首先使用筛选函数消除整数“n”以下的所有奇数非素数:[2 *(i + j + 2 * i * j)+1 | i < – [1..n / 2],j < – [i..an优化上限]]。 然后我们交掉偶数(当然不包括两个)。 这让我们留下了素数。 为什么prime函数返回(指向包含数组的指针)n下面的完整素数集? 那么,目标是能够识别(i)n以下的素数以及(ii)列出n以下的素数。 这也是为什么我选择传递一个指针,用于将n下面的素数计数作为参数。 这是不那么令人兴奋的“主要”function: int main() { long ceiling = 300*1000*1000; long *numPrimes; long *primes; […]