我已经了解了如何使用Java实现素数生成器;但我不确定我是否正确地做到了。我希望有人可以给我一些关于如何改进我的实施的一般建议!请不要给我一个答案,因为这是家庭作业,我想自己解决/成为一个更好的程序员/不作弊!
我将在下面发布描述和我的解决方案,基本上我只想知道一些一般的事情 - 我是否正确地遵循了指示(最重要的是因为我发现语言使用有点混乱)以及我是否可以制作我的程序任何更好的(如果是这样一些一般的提示会很好,所以我可以弄清楚如何...我认为我对对数的使用是远离的,但我想不出更好的方法来使用它)!
如果不允许,请道歉 - 如果不允许,请忽略或删除!非常感谢您的帮助! :)
描述:
Prime(int initialCapacity):该类 构造函数。的目的 构造函数是计算和存储 第一个initialCapacity prime第一个initialCapacity primefirst initialCapacity primefirst i 数字。这个想法是你计算的 数字一次并存储它们 你可以重复使用它们几个 倍。你应该使用ArrayList 存储素数。算法 用于计算素数是 在下一节中提供。
从一个空的素数列表开始。您可以代表此列表 使用ArrayList。
虽然ArrayList的大小不等于n,但请考虑下一个 候选素数。最初, 下一个候选素数应该是 2,但否则应该是 前任候选人的继任者 素数。
如果候选素数是素数,则将其添加到列表中。
- 醇>
继续第2步。
请注意,此算法建议您 应该使用while循环。第3步 以前的算法要求你 知道如何决定一个给定的 候选素数,c> 1,是一个素数 数。事实上, 已经存在素数的否定 建议一个天真的算法。对于 例如,您可以使用while循环 检查c%i 6 = 0表示所有正数 整数i使得1<我和我< C。 但是,不难看出这一点 一个更好的方法是确保 对于所有素数,c%p 6 = 0 p使得p
我的解决方案如下:
import java.util.*;
public class Prime {
public static void main( String[] args ){
}
public static void prime( int initialCapacity){
int index=2;
int logOfInitialCapacity = initialCapacity / (int)(Math.log(initialCapacity));
ArrayList<Integer> listOfPrimeNumbers = new ArrayList<Integer>(logOfInitialCapacity);
boolean[] isPrimeNumber = new boolean[initialCapacity + 1]; // boolean defaults to
// false
for (int i=0;i==initialCapacity;i++) {
isPrimeNumber[index] = true;
}
while ( index <= listOfPrimeNumbers.size() )
{
if (isPrimeNumber[index]) {
listOfPrimeNumbers.add(index);
}
for (int j = index; j * index <= initialCapacity; j++) {
isPrimeNumber[index * j] = false;
}
// Now mark the multiple of i as non-prime number
index++;
}
}
}
应该计算素数的第一个initialCapacity并将它们保存在arrayList中,因为问题...我只是不确定我是否完全按照问题说的那样完成。它可能更像是一整天学习并且比其他任何东西都有点磨损的产品!
非常感谢帮助和阅读所有这些;抱歉这篇长篇文章。
答案 0 :(得分:2)
答案 1 :(得分:1)
您的解决方案与问题描述并不完全匹配。
问题描述规定了素性测试(即给定候选素数,测试它是否为素数)。它还需要initialCapacity
素数。
您的解决方案存在的问题:
initialCapacity
(不是第一个initialCapacity
素数 - 的素数,以查看差异,尝试initialCapacity = 1
)。