我是新手。
因此,我一直在做Euler问题项目以提高我的Java技能,并且我超过了前2个。我坚持使用第3个。它说:
“ 13195的主要因素是5、7、13和29。
600851475143的最大素数是什么?”
我编写了以下代码:
public class Exercise {
public static void main(String[] args) {
long a = 600851475143L;
long i = 1;
boolean isPrime = true;
long currentNum = 0;
while (i <= a) {
if (a % i == 0) {
for (long j = 1; j < a; j++) {
if (a == i || a % j == 0) {
isPrime = false;
} else {
currentNum = i;
}
}
}
i++;
}
System.out.println("the largest prime factor of " + a + " is " + currentNum);
}
}
它非常适合较小的数字,例如10、20、55、100、560523等,但是当我输入较大的数字(例如600851475143L)时,代码可以编译并运行,但是什么也没有发生。
任何帮助表示感谢,谢谢!
答案 0 :(得分:4)
查看您的a
变量。是600851475143L
。
这意味着您的处理器必须根据您的情况执行最多600851475143个循环周期:
while (i <= a) {
i++;
}
我没有考虑while()
循环中的代码,但是即使没有它,代码也太多了,即使对于现代计算机也是如此:)
如果要计算该范围数的质因子,则应考虑使用比简单迭代更有效的方法。
答案 1 :(得分:0)
您具有嵌套条件,执行条件将跳CPU。
while (i <= a) {// This condition will be executed 600851475143 times
if (a % i == 0) {
for (long j = 1; j < a; j++) {// This condition will be executed 600851475143 times
到目前为止,a = 600851475143,代码将执行600851475143*600851475143
次。这就是为什么您看不到输出的原因,因为CPU忙于执行许多条件。
这也是您看到a = 100的输出的原因,因为对于此输入的迭代次数= 100*100
,在任何现代机器上都不会花费很多时间
答案 2 :(得分:0)
type Product = {Name : string; BasePrice: int}
type Size = {Medium: int; Large: int}
type Food = | Product of Product| Size of Size
let food = Food({Name = "Bagel"; BasePrice = 20}; {Medium = 10; Large = 20})
尝试这个
答案 3 :(得分:0)
帕维尔·斯米尔诺夫(Pavel Smirnov)给出的答案是正确的。实际上,代码 也在为值600851475143L
运行。只是输入数字很大,因此代码需要花费大量时间才能完成。甚至代码也不处于死锁状态。尽管如此,要证明这一点,您可以在内部循环主体中添加一个日志,例如:
System.out.println("Testing Prime for Number :"+j);
在内部循环for (long j = 1; j < a; j++){}
这样做,您将看到代码实际上正在运行。
P.S .:此算法将循环600851475143L * 600851475143L
次,这确实很耗时。