如何确定极大的素因子?

时间:2014-02-26 23:40:28

标签: java primes long-integer

所以我试图找到关于项目Euler的问题3的答案。我需要确定给定数字的最大素数因子。

引用项目欧拉: “13195的主要因素是5,7,13和29。 数字600851475143的最大主要因素是什么?“

我已经构建了我的代码,它可以完美地处理任何大小的int。 但由于他们提供了巨大的数字,我的代码有转换问题。

最初我尝试切换到长变量和长数组,但是我得到了错误: '可能从long转换为int'

那我怎么能让我的代码接受极长的数字?

public class Test {

long[] delers;

public static void main(String[] args) {
    Test test = new Test();
    test.determineDividers(600851475143,determineNumberOfDividers(600851475143));
    long a = test.determineHighestPrime(test.delers);
    System.out.println(a);
}

public void determineDividers(long getal,long aantalDelers) {
    delers= new long[aantalDelers];
    long k = 0;
    for (long i = 1; i < getal; i++) {
        if (getal % i == 0) {
            delers[k]=i;
            k++;                
        }
    }
}

public long determineNumberOfDividers(long getal) {
    int k = 0;
    for (long i = 1; i < getal; i++) {
        if (getal % i == 0) {
            k++;               
        }
    }
    return k;
}

public boolean determinePrime(long getal) {
    for (long i = 2; i < getal; i++) {
        if (getal % i == 0) {
            return false;
        }
    }
    return true;
}

public long determineHighestPrime(long[] deler) {
    for (long i = deler.length - 1; i > 0; i--) {
        if (determinePrime(deler[i]) == true) {
            return deler[i]);
        }
    }
    return 0;
}

}

感谢您的时间

编辑1:从PE中添加了示例。

编辑2:添加解决方案

public class Test {

long[] delers;

public static void main(String[] args) {
    Test test = new Test();
    test.determineDividers(600851475143L,test.determineNumberOfDividers(600851475143L));
    long a = test.determineHighestPrime(test.delers);
    System.out.println(a);
}

public void determineDividers(long getal,int aantalDelers) {
    delers= new long[aantalDelers];
    int k = 0;
    for (long i = 1; i < getal; i++) {
        if (getal % i == 0) {
            System.out.println(i);
            delers[k]=i;
            k++;                
        }
    }
}

public int determineNumberOfDividers(long getal) {
    int k = 0;
    for (long i = 1; i < getal; i++) {
        if (getal % i == 0) {
            k++;               
        }
    }
    return k;
}

public boolean determinePrime(long getal) {
    for (long i = 2; i < getal; i++) {
        if (getal % i == 0) {
            return false;
        }
    }
    return true;
}

public long determineHighestPrime(long[] deler) {
    for (int i = deler.length - 1; i > 0; i--) {
        if (determinePrime(deler[i]) == true) {
            return deler[i];
        }
    }
    return 0;
}

}

2 个答案:

答案 0 :(得分:3)

设置数组时,数组的大小必须为int。因此,这个:

delers= new long[aantalDelers];

将无法编译,因为您将参数aantalDelers声明为long。但是,当您致电determineDividers时,您为aantalDelers传入的值是determineNumberOfDividers的结果,您声明为返回long,但该函数显示为{{1} }},return kk

所以我认为您可以更改int,以便它返回determineNumberOfDividers而不是int,并将long参数更改为aantalDelers而不是{ {1}}。这样,您就可以避免任何int到 - long次转化。此外,在您使用longint作为数组索引并将其声明为k的地方,这些也应更改为i

在我的头顶,我认为这将有效,因为我认为最多2 63 的数字不能超过2个 31 除数。但是如果我的数学错误而且可以,那么除了数组之外你还需要一些其他的机制。 (事实上​​,你可能需要提出另一种算法;我觉得这个算法需要很长时间才能运行。)

答案 1 :(得分:1)

将所有变为“巨大”的变量更改为BigInteger。您需要更新Math以使用函数调用而不是java操作数,但它们都可以在BigInteger中使用。