我的程序使用了大量的内存和处理能力,我最多只能搜索到6000,有没有办法减少这个使用的内存量?这将有助于未来的编程工作,因为知道如何巧妙地使用内存将会很有用。
ArrayList<Integer> factor = new ArrayList<Integer>();
ArrayList<Integer> non = new ArrayList<Integer>();
ArrayList<Integer> prime = new ArrayList<Integer>();
Scanner sc = new Scanner(System.in);
System.out.println("Please enter how high we want to search");
long startTime = System.nanoTime();
int max = sc.nextInt();
int number = 2;
while (number < max)
{
for (int i=0;i<prime.size();i++)
{
int value = prime.get(i);
if (number % value == 0)
{
factor.add(value);
}
else
{
non.add(value);
}
}
if(factor.isEmpty())
{
prime.add(number);
}
else
{
composite.add(number);
}
factor.clear();
number++;
}
int howMany=prime.size();
System.out.printf("The are "+howMany+" prime numbers up to " +max + " and they are: " +prime );
System.out.println();
}
答案 0 :(得分:0)
你没有说你正在使用什么语言,所以这个答案是通用的。
要存储高达6,000的素数,您只需要大约3,000位,小于380字节。你的基本解决方案是Eratosthenes的Sieve以及2是唯一的偶数素数。您设置筛子只处理奇数,这将所需的存储量减半。由于筛网仅为每个奇数保存素数或非素数,因此每个数字的存储量可减少到一位。
一旦你设置了筛子,有很多站点,包括这个站点有不同语言的说明,你只需要从筛子中检索你的范围内的数字的素数/非素值。假设已经设置了筛子,这是用于检查数字是否为素数的伪代码:
boolean function isPrime(number)
// Low numbers
if (number < 2)
return false
endif
// Even numbers
if (number is even)
return number == 2
endif
// Odd numbers >= 3
return sieve[(number - 1) / 2] == 1
end function
低数字不是素数。 2是唯一的素数;所有其他偶数都不是素数。奇数2n + 1的主标志存储在筛子的第n位。这假定您使用的语言允许位级访问,类似于Java中的BitSet
。