我找到了除以num的最高素因子,如程序所示, 数组和
存在问题arr[j] = i;
j++;
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 at primenum.main(primenum.java:13)
//to find highest prime factor
public class primenum {
public static void main(String[] args) {
double num = 600851475143.0;
int j = 1;
int arr[] = {j};
for(int i=2; i<=num/2; i++)
{
if((num%i) == 0 )
{
arr[j] = i;
j++;
}
}
// take the last item from array, coz its last big prime
System.out.println("largest prime is "+ arr[j-1]);
}
}
解决这个问题的最佳方法是什么?
我正在解决这个问题,
对于素数我需要做更多,但我已陷入初始阶段。
答案 0 :(得分:3)
这一行
int arr[] = {j};
创建一个仅在执行时包含j
值的数组。你可能想要
int arr[] = new int[j];
更新:根据你在下面留下的答案,试验师花了太长时间。 Sieve of Eratosthenes是一种非常有效的经典算法,但Sieve of Atkin是用于查找素数的最先进算法之一。
答案 1 :(得分:2)
通过创建数组arr [] = {j},您创建了一个只包含j或1的数组。这意味着数组的长度为1,因为它包含1个元素。因此,arr [1]超出范围。 Java不会动态调整数组大小,因此您必须创建一个足够大的数组来包含您计划保存的所有数据。或者使用类似ArrayList的东西,它可以动态调整大小。
答案 2 :(得分:1)
看起来你找到num
的所有除数;其中一个将是最大的主要因素。仅有两个相关事实应该有助于使问题易于处理小数字:
1.如果d
是除数,那么num/d
也是如此
2.您无需检查任何大于sqrt(num)
的除数。
要跟踪除数,请使用Set对象。
答案 3 :(得分:0)
java中的数组不是列表:一旦分配,你的数组就不会神奇地增长。
您使用以下方法创建了数组:
int arr[] = {j};
因此,阵列只有一个单元格。
您应该使用至少num/2
个单元格初始化数组,
喜欢的东西
int arr[] = new int[num/2]; arr[0] = j;
答案 4 :(得分:0)
看起来你启动j = 1并且你的数组中只有一个元素要开始,所以在第一次通过你的for循环时你会找到arr [1],但是数组中的第一个元素是arr [ 0]。 Java数组是零索引的,这意味着如果数组中有10个元素,它们位于arr [0]到arr [9]中。