【发布时间】:2014-02-26 23:40:28
【问题描述】:
所以我试图找到关于欧拉项目的问题 3 的答案。我需要确定给定数字的最大素数。
引用 Project Euler : “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;
}
}
【问题讨论】:
-
在那些巨大的常量后面加上一个
L,即600851475143L,告诉Java它们必须是long。 -
您也可以考虑转到
BigDecimal或BigInteger课程。它们专为处理任何大小的数字而设计。 -
您必须将
L添加到两个常量。 -
“确定给定数的最大素因数”你不必存储它的所有素因数,更不用说它的所有除数,所以不必知道他们有多少。 -- 只需使用
long。 -- 如果n=a*b和a是素数,那么n的素数分解是a加上b = n / a的素数分解,对吧? ... 如果n=2*b和b不能被 2,3,4,5,6 整除,但 7 将其整除,则b=7*c和c可以不能被2,3,4,5,6 - 因为否则b会。对吗? -
@ajb 对。再一次,如果
n=a*bwherea<=b然后是a*a <= a*b = n,所以当我们通过i=7,8,9,...测试c时,当我们到达i这样i*i > n,我们真的需要测试c(i+1)或者我们现在是否已经知道c是素数?
标签: java primes long-integer