Java-素数算法实现&x27;行不通
我写了这段代码,用来搜索素数并将它们放入一个数组中。这是:Java-素数算法实现&x27;行不通,java,primes,Java,Primes,我写了这段代码,用来搜索素数并将它们放入一个数组中。这是: int[] prime_array = new int[(int)s.upper_bound]; int index_in_array = 0; boolean are_we_done = false; int index = 1; boolean is_prime = true; while (!are_we_done) { try { for (int i = 1; i < index; i++) {
int[] prime_array = new int[(int)s.upper_bound];
int index_in_array = 0;
boolean are_we_done = false;
int index = 1;
boolean is_prime = true;
while (!are_we_done) {
try {
for (int i = 1; i < index; i++) {
if ((index%i)==0) {
is_prime = false;
}
}
if (is_prime) {
prime_array[index_in_array] = index;
index_in_array++;
}
index++;
is_prime = true;
}
catch (IndexOutOfBoundsException e) {
are_we_done = true;
break;
}
}
int[]素数数组=新的int[(int)s.上界];
数组中的int索引=0;
布尔值are_we_done=false;
int指数=1;
布尔值为_素数=真;
而(!我们完成了吗){
试一试{
对于(int i=1;i
不幸的是,它捕获的唯一素数是1。知道它为什么不起作用吗?您的
for
循环正在查找以i=1
开始的因子,如果索引%i==0
,则确定它不是素数。但是所有整数的n%1==0
表示某事物不是素数的最低因子是2
编辑:
以下是一些其他建议:
- 使用一个适当有界的循环遍历候选素数
- 仅检查候选素数的平方根以下的因子
- 只检查2和奇数作为素数(因为2以上的偶数都不是素数,1是单位,不是素数)
- 仅检查2和奇数作为因子(因为2以上的偶数不能作为素数因子)
- 改用a
for
循环正在查找以i=1
开头的因子,如果索引%i==0
,则确定它不是素数。但是所有整数的n%1==0
表示某事物不是素数的最低因子是2
编辑:
以下是一些其他建议:
- 使用一个适当有界的循环遍历候选素数
- 仅检查候选素数的平方根以下的因子
- 只检查2和奇数作为素数(因为2以上的偶数都不是素数,1是单位,不是素数)
- 仅检查2和奇数作为因子(因为2以上的偶数不能作为素数因子)
- 改用a
ArrayOutOfBoundException
。您可以很容易地检查填充数组的时刻,那么为什么要等待抛出异常并捕获它呢?您不能依靠编程错误退出循环!!另外,异常是慢的,慢的,慢的。你的标题暗示算法不好,但我想你是指你自己的实现。@Dici为什么不?我听说过for循环,但我认为阅读这段代码更容易。@Dici为什么?在这种情况下,只能在数组已满时抛出ArrayOutOfBoundException
。您可以很容易地检查填充数组的时刻,那么为什么要等待抛出异常并捕获它呢?您不能依靠编程错误退出循环!!另外,异常是缓慢的,缓慢的,缓慢的。这不是唯一的问题。这并不能解决问题question@Dici我当然同意代码在很多其他方面都不好,但这正是OP所问的问题。@khelwood还有什么其他方面?@khelwood现在答案是完整的,+1。但是,它返回1作为素数,要修复它,请将is_prime
初始化为false。@khelwood关于平方根的部分是正确的。然而,我不能使用for循环,因为我不知道需要多少素数。同样的原因也解释了为什么使用筛子效率不高。这不是唯一的问题。这并不能解决问题question@Dici我当然同意代码在很多其他方面都不好,但这正是OP所问的问题。@khelwood还有什么其他方面?@khelwood现在答案是完整的,+1。但是,它返回1作为素数,要修复它,请将is_prime
初始化为false。@khelwood关于平方根的部分是正确的。然而,我不能使用for循环,因为我不知道需要多少素数。这也是为什么使用筛子效率不高的原因。