- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我编写的用于在上限可以大到 1000000000 的范围之间查找素数的代码。我使用了 Hashmap,除了 2 之外没有存储任何偶数,也没有存储 sero 和 1但当我使用输入 lb = 1 和 ub =1000000000 运行此代码时,它仍然给出运行时错误(内存不足)。请帮忙
这是我的代码:-
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
class Samp {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t, limit, m, n;
double lb, ub, c;
t = sc.nextInt();
while (t > 0) {
c = 3;
HashMap<Integer, Boolean> primeflags = new HashMap<Integer, Boolean>();
primeflags.put(2, true);
lb = sc.nextDouble();
ub = sc.nextDouble();
while (c <= ub) {
primeflags.put((int) c, true);
c = c + 2;
}
limit = (int) Math.sqrt(ub);
for (m = 2; m <= limit; m++) {
for (n = m * m; n <= ub; n += m) {
if (primeflags.containsKey(n))
primeflags.remove(n);
}
}
Iterator<Integer> iterator = primeflags.keySet().iterator();
while (iterator.hasNext()) {
Integer key = (Integer) iterator.next();
if(key >= lb)
System.out.println(key);
}
--t;
}
sc.close();
}
}
收到答案后,我编码了:但它仍然给出 TLE
import java.util.BitSet;
import java.util.Scanner;
public class Prime {
private static BitSet bitSet = new BitSet(1000);
private static int max = 3;
public static boolean isPrime(int n) {
if(n == 2)
return true;
if(n < 3 || n % 2 == 0)
return false;
if(n <= max)
return !bitSet.get(n / 2);
for(int i = 3; i <= n; i += 2) {
if(i * 2 > n)
break;
if(!bitSet.get(i / 2)) {
int multiple = max / i;
multiple *= i;
if(multiple <= i)
multiple = i * 2;
clearMultiple(i, multiple, n);
}
}
max = n;
return !bitSet.get(n / 2);
}
private static void clearMultiple(int prime, int multiple, int max) {
while(multiple <= max) {
setNotPrime(multiple);
multiple += prime;
}
}
private static void setNotPrime(int n) {
if(n % 2 == 0)
return;
bitSet.set(n / 2, true);
}
public static void getPrimeGreaterOrEqual(int n,int upperbound) {
// make sure we start with an odd number
if( n == 1 || n == 0){
System.out.println(2);
n = 3;
}
if(n % 2 == 0 && n != 2)
++n;
// loop until we found one
while(n <= upperbound) {
//if the number is registered as prime return it
if(isPrime(n))
System.out.println(n);
// else check next one
n += 2;
}
}
public static void main(String args[])
{
Scanner sc = new Scanner(System.in);
int t,lb,ub;
t = sc.nextInt();
while(t > 0){
lb = sc.nextInt();
ub = sc.nextInt();
getPrimeGreaterOrEqual(lb, ub);
--t;
}
sc.close();
}
}
最佳答案
将您的算法转换为使用 BitSet相反,您将看到性能和内存使用量的巨大改进。
如果您四处搜索,您会发现该算法的许多变体。例如,您可以看一下:http://www.dreamincode.net/forums/topic/192554-secret-code-vii-prime-numbers/
关于java - 优化 sieve 的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12996291/
根据链接:http://en.wikipedia.org/wiki/Sieve_of_Sundaram,用于生成最多为 n 的素数列表的“sundaram 筛法”的运行时间为 O(n*log(n))。
我目前正在尝试比较两种不同素数生成算法的平均运行速度。我有这个简单的埃拉托色尼筛法实现: std::vector sieve_of_eratosthenes(int32_t n) { std:
我正在研究一个简单的埃拉托色尼筛法算法,代码如下: int main() { const int n = 1000000; int sqrn = floor(sqrt(n));
当我偶然发现一种称为欧拉筛的改进版的埃拉托色尼筛时,我正在阅读不同的筛分算法。根据Wikipedia在 Haskell 中有一个稍微不同版本的想法(称为 Turner's Sieve)的实现。 现在我
这是我编写的用于在上限可以大到 1000000000 的范围之间查找素数的代码。我使用了 Hashmap,除了 2 之外没有存储任何偶数,也没有存储 sero 和 1但当我使用输入 lb = 1 和
我最近编写了这段代码,但想知道是否有更快的方法来查找素数(不是筛子;我仍在尝试实现)。有什么建议吗?我正在使用 Python,而且对它还很陌生。 def isPrime(input): cur
我正在编写一种方法来查找不超过 n(埃拉托色尼筛法)的素数,是的,这是作业。我希望提高我编写的方法的性能。最近几天我一直在调整它,但无法遵循给出的伪代码并提高性能。 伪代码如下: 创建要处理的号码队列
目前我有两个功能: 一个需要生成素数的数量。 第二个取素数上限生成。 它们是这样编码的(在 C++ 中): prime_list erato_sieve(ul_it upper_limit) {
我一直在研究 Stroustrup 的书: http://www.amazon.com/Programming-Principles-Practice-Using-C/dp/0321543726我目前
我正在尝试使用筛子打印出一组特定的素数,但我似乎没有得到任何输出,但它编译正常。程序不会退出,除非我强制执行,所以我猜它卡在了某个地方...我该如何解决这个问题? #include #include
我编写了以下代码,使用 Sieve 的方法列出了 20 亿以内的所有质数。我使用位掩码来标记目的。虽然我能够正确地得到素数,但每次都会丢失一些开头的素数。请帮我找出程序中的错误。 #include
来自 Wikipedia: The complexity of the algorithm is O(n(logn)(loglogn)) bit operations. 你是如何做到这一点的? 复杂性
来自 Wikipedia: The complexity of the algorithm is O(n(logn)(loglogn)) bit operations. 你是如何做到这一点的? 复杂性
我正在尝试实现 Sieve of Eratosthene在 C++ 中。但是,经过多次尝试后,我总是会遇到运行时错误。我认为这与正在使用的迭代器的状态在某处损坏有关。我不能把我的手指放在上面。这是我的
最近我一直在研究使用阿特金筛 (http://en.wikipedia.org/wiki/Sieve_of_atkin) 生成其素数的 C++ 素数生成器。我的目标是能够生成任何 32 位数字。我将主
我正在尝试理解“Eratosthenes 筛法”。这是我的算法(下面的代码),以及我无法理解的功能列表(按顺序)。 为什么 i * i 比 i * 2 更有效?是的,我可以理解它会减少迭代次数,因此效
我用 Java 编写了以下“分段筛”程序。它需要筛选一系列数字,使用“筛选素数”(素数数组列表变量)划掉复合数,然后返回尚未划掉的素数。这是代码: public ArrayList sieveWork
我更多地来自 java/php 背景,我现在正在学习 C++。我试图用 C++ 重新创建埃拉托色尼筛法并打印出 5000 以下的所有素数。 我正在用 http://www.compileonline.
我想首先说明我是一个 python 新手,我很感激任何能向我清楚、完整地解释它的人。 我正在查看以下链接中的代码: http://rosettacode.org/wiki/Sieve_of_Erato
我正在研究 PrimeSieve 的数组列表实现,我已经编写了所有代码,但它似乎无法运行,所以我不确定是因为循环不好还是因为我设置了错误的扫描器。 这是代码。 import java.util.S
我是一名优秀的程序员,十分优秀!