所以我试图找到关于项目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;
}
}
答案 0 :(得分:3)
设置数组时,数组的大小必须为int
。因此,这个:
delers= new long[aantalDelers];
将无法编译,因为您将参数aantalDelers
声明为long
。但是,当您致电determineDividers
时,您为aantalDelers
传入的值是determineNumberOfDividers
的结果,您声明为返回long
,但该函数显示为{{1} }},return k
是k
。
所以我认为您可以更改int
,以便它返回determineNumberOfDividers
而不是int
,并将long
参数更改为aantalDelers
而不是{ {1}}。这样,您就可以避免任何int
到 - long
次转化。此外,在您使用long
和int
作为数组索引并将其声明为k
的地方,这些也应更改为i
。
在我的头顶,我认为这将有效,因为我认为最多2 63 的数字不能超过2个 31 除数。但是如果我的数学错误而且可以,那么除了数组之外你还需要一些其他的机制。 (事实上,你可能需要提出另一种算法;我觉得这个算法需要很长时间才能运行。)
答案 1 :(得分:1)
将所有变为“巨大”的变量更改为BigInteger。您需要更新Math以使用函数调用而不是java操作数,但它们都可以在BigInteger中使用。